Eu preciso verificar os números em cada linha em uma coluna específica em uma variável em relação a todas as linhas em duas colunas específicas em outra variável usando awk
, mantendo as linhas na primeira variável que atendem aos parâmetros.
As tentativas que fiz até agora para fazer isso em um awk
comando poderoso falharam. Obviamente, posso fazer isso em um loop externo, mas seria muito lento, pois tenho centenas de milhares de linhas para verificar. Agradeço toda e qualquer ajuda para resolver isso, e estou sempre procurando melhorar meu uso do awk, então se você tiver uma solução seria ótimo ter uma explicação para que eu possa aprender e me aprimorar.
Aqui está um exemplo:
Digamos que eu queira imprimir apenas as linhas da coluna 2 de
${ListToCheckFrom}
, se o número for > coluna 2 e < coluna 3 em qualquer linha de${ListToCheckAgainst}
Exemplo de entrada:
ListToCheckFrom="C,2 C,22 C,12 hr,15" ListToCheckAgainst="C1,25,50 hr1,22,30 r,12,18 C,15,44"
Saída esperada:
C,22 hr,15
Como você marcou a pergunta com
bash
, você pode usar a substituição de processo para ler as variáveis do shell, como arquivos de entrada. O seguinte snippet de script deve fazer:Isso especificará o
echo
conteúdo 'd de$ListToCheckAgainst
como primeiro arquivo de entrada e oecho
conteúdo 'd de$ListToCheckFrom
como segundo arquivo de entrada. Ele definirá umaawk
variávellist
para umconstr
ouchk
antes de "abrir" cada arquivo, para queawk
possa distinguir internamente qual dos "arquivos" está sendo processado no momento.$ListToCheckAgainst
, ele simplesmente armazena os limites "inferior" e "superior", conforme especificado nas colunas 2 e 3, em arrayslow
ehigh
, respectivamente. Além disso, ele pula o processamento imediatamente para a próxima linha de entrada.$ListToCheckFrom
, ele varre todos os intervalos registrados anteriormente e, se descobrir que a coluna 2 se enquadra em qualquer um deles, imprime-a (e imediatamente pula o processamento para a próxima linha de entrada).Se seus dados estiverem armazenados em arquivos "físicos" em vez de variáveis de shell, você pode simplesmente usar os nomes dos arquivos em vez das substituições de processo como argumentos de linha de comando.