Subtrahieren derselben Spalte zwischen zwei Zeilen in awk

Subtrahieren derselben Spalte zwischen zwei Zeilen in awk

Ich möchte die zweite Zeile von der ersten Zeile subtrahieren. Die Datei sieht so aus

tmptxt

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

Die gewünschte Ausgabe ist

8 6 4 2

Wie macht man das in awk?

Ich konnte nur für eine einzelne Spalte eine Ausgabe erstellen:

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

Antwort1

Eine Lösung mitawk

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

ergibt ein Ergebnis von

0 0 8 6 4 2

Da awk bei Rechenoperationen Zeichenfolgen ohne gültige Zahlen als 0 interpretiert, können Sie, falls Sie die Ergebnisse entfernen möchten, deren Quellfeld nicht numerische Werte enthält, dies durch Hinzufügen einer zusätzlichen Bedingung tun.

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

ergibt ein Ergebnis von

8 6 4 2

Antwort2

AlternativePythonLösung:

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

Die Ausgabe:

8 6 4 2

Antwort3

Der folgende Befehl liefert dieselbe Ausgabe. l.txt enthält die Eingabe, die Sie in der Frage angegeben haben

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"

Ausgabe

8 6 4 2

verwandte Informationen