Subtraindo a mesma coluna entre duas linhas no awk

4

Eu quero subtrair a segunda linha com a primeira linha. O arquivo é assim

txtxt

A B 1 2 3 4 
C D 9 8 7 6

A saída desejada é

8 6 4 2

Como fazer isso no awk?

Consegui produzir apenas uma coluna:

awk '{$temp=$3-prev3; prev3=$3}{print $temp}'
    
por nabilishes 23.11.2017 / 05:07

3 respostas

4

Uma solução com awk

awk '
    NR==1 {split($0,a)}
    NR==2 {split($0,b)}
    END {for(i=1;i<=NF;i++) printf "%d ", b[i]-a[i]}
' input.txt

dá um resultado de

0 0 8 6 4 2

Como o awk interpreta strings sem números válidos como 0 durante operações aritméticas, no caso de você querer remover os resultados nos quais o campo de origem contém valores não numéricos, você pode fazer isso adicionando uma condição adicional.

awk '
    NR==1 {split($0,a)}
    NR==2 {split($0,b)}
    END {
        for(i=1;i<=NF;i++)
        if(a[i] ~ /^[0-9]+$/ && b[i] ~ /^[0-9]+$/)
        printf "%d ", b[i]-a[i]
    }
' input.txt

dá um resultado de

8 6 4 2
    
por 23.11.2017 / 05:45
2

Solução alternativa Python :

python -c 'import sys; f=open(sys.argv[1],"r"); 
print(" ".join(str(int(d2)-int(d1)) 
for d1,d2 in zip(next(f).split()[2:], next(f).split()[2:]))); f.close()' file

A saída:

8 6 4 2
    
por 23.11.2017 / 09:31
0

abaixo do comando também fornece a mesma saída. l.txt contém a entrada que você forneceu na pergunta

for i in {1..6}; do awk -v i="$i" 'BEGIN{sum=0}{sum=$i-sum}END{print sum}' l.txt ; done| tr "\n" " " | awk '{$1="";$2="";print $0}' | sed "s/^ //g"

saída

8 6 4 2
    
por 23.11.2017 / 07:44