Erstellen Sie eine neue Spalte basierend auf vorhandenen Spalten mithilfe der if else-Anweisung in awk

Erstellen Sie eine neue Spalte basierend auf vorhandenen Spalten mithilfe der if else-Anweisung in awk

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 awkso 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 awkSkript 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 1am 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 ifauch 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

verwandte Informationen