2017-08-05 6 views
0

Ich versuche, eine einfache Spalte hinzufügen der Spalte $ i und Spalte $ ((i + 33)), ich bin mir nicht sicher, ob die Syntax korrekt ist oder nicht.awk Feld zählen Arithmetik

Zwei Dateien werden zuerst zusammengeklebt und dann eine Spalte zusätzlich über zwei Dateien durchgeführt werden.

Vielen Dank!

paste DOS.tmp DOS.tmp2 | awk '{ printf "%12.8f",$1 OFS; for(i=2; i<33; i++) printf "%12.8f",$i+$((i+33)) OFS; if(33) printf "%12.8f",$33+$66; printf ORS}' >| DOS.tmp3 
+2

Bitte aktualisieren Sie Ihre Q mit Beispieldaten von ca. 4-6 Felder über UND die erforderliche Ausgabe von diesem Eingang. Wenn Sie wissen, wie Sie es für 6 Spalten lösen können, wissen Sie, wie Sie es für Ihren größeren Datensatz lösen können. Viel Glück. – shellter

+1

Was denken Sie ist der Vorteil von '$ ((i + 33))' anstelle von '$ (i + 33)'? –

Antwort

1

In awk, anders als in bash, hat variable Erweiterung nicht ein Dollarzeichen ($) vor dem Variablennamen erfordern. Variablen werden wie a = 2 definiert und wie print a verwendet.

Dollarzeichen ($) is used to refer to (input) fields. So druckt print $1 das erste Feld, und print $a wird das Feld durch eine variable a, in unserem Fall das zweite Feld verwiesen drucken. In ähnlicher Weise wird print $a, $(a+3) das zweite und fünfte Feld (getrennt durch die OFS) drucken.

dies zusammen genommen alle, macht Ihr Programm wie folgt aussehen:

awk '{ out = sprintf("%12.8f", $1) 
     for (i=2; i<=33; i++) out = out sprintf("%s%12.8f", OFS, $i+$(i+33)) 
     print out }' numbers 

Hinweis wir sprintf verwenden, um alle Werte auf die Ausgangsleitung variable out erste, concatenating wie out = out val zu drucken, und dann Drucken des kompletten Ausgabesatz mit print.

1

Sind Sie versuchen, Spalte i in file_1 und file_2 hinzufügen? In diesem Fall gebe ich ein Beispiel:

paste <(seq -s' ' 33) <(seq -s' ' 33) | awk '{ for(i=1; i<=33; i++) { printf "%f",$i+$((i+33)) ; if(i!=33) printf OFS;} printf ORS}' 
Verwandte Themen