
Ich habe einen Datensatz mit > 7 Mio. Zeilen (und in Wirklichkeit > 20 Spalten) und möchte eine neue Spalte erstellen (mein Datensatzbeispiel hat 5 Spalten), dies wäre also Nummer 6. Mein Datensatz hat eine Kopfzeile.
Die Bedingungen sollten wie folgt sein: Wenn der Wert der Spalte 1 größer ist als der Wert der Spalte 3, dann sollte die neue Spalte den Wert der Spalte 1 haben, andernfalls sollte sie den Wert „1 minus dem Wert der Spalte 1“ haben.
Ich habe dies versucht, aber es funktioniert nicht:
awk '{ if ($1 > $3) $6 == $1}; else $6 == 1-$1}' test.txt > test2.txt
Datensatz (Beispiel):
col1 col2 col3 col4 col5
1 3 4 string string
4 2 1 string string
Für Zeile 1 sollte Spalte 6 1-1 = sein 0
, für Zeile 2 sollte Spalte 6 sein 4
.
Antwort1
==
prüft, ob die Werte zweier Operanden gleich sind oder nicht, und =
weist Werte von Operanden auf der rechten Seite dem Operanden auf der linken Seite zu. Die folgenden Zeilen sollten funktionieren:
awk '{ if($1>$3) $6=$1; else $6=1-$1; print $0; } ' test01 > test02
oder:
awk '$1>$3{ $6=$1; print $0; } $1<$3{ $6=1-$1; print $0; }' test01 > test02
Denn awk
so funktioniert es:
awk 'condition1{main1} condition2{main2} ... conditionN{mainN}' file.txt
wenn keine Bedingungen angegeben sind, wird immer das jeweilige Hauptelement ausgeführt.
Antwort2
Versuchen Sie dies. Musste nur ==
ersetzt =
und die Klammern hinzugefügt werden.
awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt
Antwort3
$ awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
{ $(NF+1) = $1 }
$1 <= $3 { $NF = 1 - $NF } 1' file
col1 col2 col3 col4 col5 newcol
1 3 4 string string 0
4 2 1 string string 4
Wenn das awk
Skript die neue Spaltenüberschrift hinzugefügt und ausgegeben hat, beginnt es mit der Berechnung des Werts der neuen Spalte für die anderen Zeilen.
Der Wert wird berechnet, indem er zunächst auf den Wert in Spalte 1 gesetzt wird. Wenn Spalte 1 kleiner oder gleich Spalte 3 ist, wird dieser von 1 abgezogen. Das Zeichen 1
am Ende bewirkt, dass der geänderte Datensatz (die geänderte Zeile) gedruckt wird.
Wenn Sie („dem Feld nach dem letzten Feld“) einen Wert zuweisen, $(NF + 1)
wird der aktuellen Zeile eine zusätzliche Spalte hinzugefügt und außerdem NF
(die Anzahl der Felder im aktuellen Datensatz) erhöht.
Sie können dies natürlich if
auch mit einer expliziten -Anweisung tun:
awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
{ if ($1 > $3) $(NF+1) = $1; else $(NF+1) = 1 - $1 } 1' file