2016-08-09 7 views
2

Wenn ich habe:Differenz zwischen benachbarten Datenzeilen, mit mehreren Spalten

1 2 3 4 5 6 . . 
3 4 5 4 2 1 . . 
5 7 5 7 2 0 . . 
. 
. 

Ich mag die Differenz benachbarter Datenzeilen zeigen, so dass es zeigen würde:

2 2 2 0 -3 -5 . . 
2 3 0 3 0 -1 . . 
. 
. 

fand ich die Post difference between number in the same column using AWK, und die zweite Antwort anzupassen, dachte ich, dass dies die Arbeit machen wird:

awk 'NR>1{print $0-p} {p=$0}' file 

aber das Erzeugnis s Ausgabe in und von einer einzelnen Spalte. Wie bekomme ich es, die Spaltenstruktur der Daten beizubehalten?

+0

die Antwort [hier] (https: // Unix. stackexchange.com/questions/112105/awk-pairwise-differences) ist was ich will, aber wie ext Beende es auf beliebig viele Spalten? – physkets

+0

anstatt nur auf eine andere Frage zu verlinken, lass diese für sich stehen: was willst du machen? – fedorqui

+1

@fedorqui Ich werde die Frage so umordnen, dass es so ist. – physkets

Antwort

1
$ cat tst.awk 
NR>1 { 
    for (i=1; i<=NF; i++) { 
     printf "%2d%s", $i - p[i], (i<NF ? OFS : ORS) 
    } 
} 
{ split($0,p) } 

$ awk -f tst.awk file 
2 2 2 0 -3 -5 
2 3 0 3 0 -1 
+1

Das funktioniert! Dies war das erste Mal, dass ich awk benutzte. Ich sollte wirklich anfangen, awk für mich selbst herauszufinden. Vielen Dank! – physkets

+0

Lesen Sie das Buch Effective Awk Programming, 4. Auflage, von Arnold Robbins, wenn Sie zu irgendeinem Zeitpunkt in Ihrem Leben irgendeine Art von Textmanipulation durchführen werden. –

+0

Danke! Also werde ich mir diese ansehen: * https://www.gnu.org/software/gawk/manual/html_node/index.html * http://www.funtoo.org/Awk_by_Example,_Part_1 – physkets

0

so etwas wie dieses Versuchen:

awk '{for (i=1; i <= NF; i++) { c[i] = $i - c[i] }; count = NF } 
    END { for (i = 1; i <= count; i++) { printf c[i] " "}}' numbers 
+0

das gibt mir eine Reihe von Nullen. – physkets

+0

* eine Reihe von Zahlen – physkets

+0

Entschuldigung, es war vorher nicht klar. Ich habe mehrere Zeilen mit Daten ... – physkets

0

Ausgeschrieben:

$ cat > subtr.awk 
{ 
    for (i=1; i<=NF; i++) b[i]=a[i] 
    # for (i in a) b[i]=a[i] 
    n=split($0,a) 
} 
NR > 1 { 
    for (i=1; i<=NF; i++) { 
    #for(i in a) { 
     printf "%s%s", a[i]-b[i], (i==n?ORS:OFS) 
    } 
delete b 
} 

Test-it:

$ awk -f subtr.awk file 
2 2 2 0 -3 -5 
2 3 0 3 0 -1 
+0

Wie mache ich das in mehreren Datenzeilen? – physkets

+0

Es tut es. In Ihrem Beispiel wird 'line1' von' line2' subtrahiert. Wenn Sie meiner Lösung mehr Zeilen zuführen, sagen wir 3, wird "line1" von "line2" subtrahiert und diese Differenz wird von "line3" subtrahiert. –

+0

OK, ich sehe, dass Sie die Frage aktualisiert haben. Gib mir eine Minute. –

Verwandte Themen