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