Para loop com o comando awk no corpo não funcionando

0

Estou tentando executar o seguinte comando:

for i in test1.txt do awk '$1==$i {sum +=$4}END {print sum}' test2.txt

Onde test1.txt se parece com:

A
B
C
D
E

Mas não está funcionando. O que eu quero alcançar é, para cada letra dentro do arquivo test1.txt , encontrar todas as linhas de test2.txt que tenham a mesma letra em sua primeira coluna, e para essas linhas, soma todos os seus valores na coluna 4 th .

    
por Ljubo 26.03.2018 / 04:48

2 respostas

2

O motivo pelo qual isso não funciona da maneira como você escreveu é que awk interpretará $i como "o i th field" e, como a awk variable i não tem valor, você receberá um erro ou, se você estiver usando o GNU awk ou mawk , $i será o mesmo que $0 , que é a linha inteira (com mawk ou GNU awk , o programa parece para linhas cuja primeira coluna é igual à linha inteira).

Em vez disso, para "importar" a variável shell para awk :

awk -v i="$i" '$1 == i { sum += $4 } END { print sum }' test2.txt

Além disso, o valor da variável de shell $i sempre será o nome do arquivo test1.txt (já que é isso que você faz o loop).

Para percorrer o conteúdo do arquivo:

while IFS= read -r i; do
    awk ...as above...
done <test1.txt

A resposta da αғsнιη mostra como você pode fazer isso sem usar um loop de shell.

    
por 26.03.2018 / 08:45
1

Você pode usar awk sozinho aqui.

awk 'NR==FNR{a[$1]++; next} ($1 in a) {sum+=$4} END{print sum}' file1.txt file2.txt
    
por 26.03.2018 / 04:53