Eu fiz uma pergunta muito semelhante hoje antes, no entanto, percebi que preciso aumentar os parâmetros para o comando. Editei o comando para outro parâmetro ok, mas no próximo parâmetro tive menos sucesso e não sei por quê. Aqui está o que estou tentando (e falhando) resolver.
Eu preciso verificar as informações em cada linha em um conjunto específico de colunas 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 de
${ListToCheckFrom}
, se a coluna 2 for >= e a coluna 3 for <= para as colunas correspondentes de qualquer linha de${ListToCheckAgainst}
. Além disso, a coluna 1 de${ListToCheckFrom}
deve ser idêntica à coluna 1 em${ListToCheckAgainst}
Exemplo de entrada:
ListToCheckFrom="r,2,3
C,22,24
C,12,13
C,51,59
C,15,20
C,13,18"
ListToCheckAgainst="C,25,50
C,22,30
C,12,18
C,15,17
C,1,12
C,60,200"
- Saída esperada:
C,22,24
C,12,13
C,15,20
C,13,18
- O que tentei com base em uma resposta (graças a @AdminBee) a uma pergunta anterior mais simples que fiz hoje:
awk -F',' 'list=="constraints"{n++; low[n]=$2;high[n]=$3;c[n]=$1;next}
{for (i=1;i<=n;i++) {if (($1==c[i])&&($2>=low[i]&&$2<=high[i])||($3>=low[i]&&$3<=high[i])) {print;next};}}' list=constraints <(echo "$ListToCheckAgainst") list=check <(echo "$ListToCheckFrom")
Estou usando o Ubuntu.
Com base na outra resposta que você obteve para sua pergunta anterior:
Em relação ao script que você perguntou sobre a modificação, que era isso na resposta da sua pergunta anterior:
O primeiro passo para você tentar aprimorá-lo deveria ter sido torná-lo um pouco mais fácil de ler, por exemplo, se você executar a parte awk
gawk -o-
e adicionar as partes do shell de volta, obterá isso:e a partir daí, espero que seja fácil ver que tudo o que você precisava fazer para que funcionasse para seus novos requisitos era alterá-lo para isso: