Restando la misma columna entre dos filas en awk

Restando la misma columna entre dos filas en awk

Quiero restar la segunda línea con la primera línea. El archivo es así

tmptxt

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

La salida deseada es

8 6 4 2

¿Cómo hacer esto en awk?

Logré generar solo una columna:

awk '{$temp=$3-prev3; prev3=$3}{print $temp}'

Respuesta1

una solución conawk

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

da un resultado de

0 0 8 6 4 2

Dado que awk interpreta cadenas sin números válidos como 0 durante las operaciones aritméticas, en caso de que desee eliminar los resultados en los que el campo fuente contiene valores no numéricos, puede hacerlo agregando una condición 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

da un resultado de

8 6 4 2

Respuesta2

AlternativaPitónsolución:

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

La salida:

8 6 4 2

Respuesta3

El siguiente comando también proporciona el mismo resultado. l.txt contiene la entrada que ha proporcionado en cuestión

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"

producción

8 6 4 2

información relacionada