2017-07-03 1 views
1

ich eine txt-Datei enthält:Wie zusätzliche Zeilen drucken, basierend auf dem aktuellen Spaltenwert mit AWK

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9,218e-9,136e-9,82e-9,82e-9,27e-9,0 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9,27e-9,0 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9,27e-9,27e-9,0 

und auf der Basis der Spalte 5, wollte ich in einer Spalte AWK alle den Wert setzen. "," wird verwendet, um die Daten zu trennen.

Ergebnis wird so aussehen:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0 
+0

Was hast du selbst versucht? – Inian

Antwort

1

awk Lösung:

awk -F'[[:space:]]+|,' '{ for(i=5;i<=NF;i++) print $1,$2,$3,$4,$i }' file 
  • -F'[[:space:]]+|,' - Leerzeichen und Komma als Feldtrennzeichen behandelt

  • for(i=5;i<=NF;i++) - obwohl die

Der Ausgang Artikel des 5. Feld Iterieren:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0 
+0

Vielen Dank @RomanPerekruh. Das funktioniert super! – terence

+0

@terence, du bist willkommen – RomanPerekhrest

1

Eine weitere in awk mit split:

$ awk '{split($5,a,",");for(i in a) print $1,$2,$3,$4,a[i]}' file 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9 
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9 
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9 

Ausgabe in zufälliger Reihenfolge wird durch zu for(i in a). Das kann mit festgesetzt:

... n=split($5,a,","); for(i=1;i<=n;i++) print ... 
+1

kann auch mit 'Split ($ 5, a,", ") behoben werden; für (i = 1; i in a; i ++) ' –

0

versuchen einen weiteren Ansatz hier, wo ich diese Zeichenfolge „TRUE“ am überlegen ist vorhanden in input_file von Ihnen in jeder Zeile.

awk -F'TRUE[^0-9]*|,' '{for(i=2;i<=NF;i++){print $1,"TRUE",$i}}' Input_file 

Erläuterung: Einfach machen Feldtrenn als String TRUE bis erste Ziffer beginnt oder Komma als Feldtrennzeichen (so beide Feldtrennzeichen wird als pro input_file arbeiten nur). Dann durchstreife ich die Felder vom 2. Feld bis zur Gesamtzahl der Felder durch eine for-Schleife. Drucken Sie nun das erste Feld zusammen mit der Zeichenfolge TRUE und dann den Wert des Feldes. Erwähnen Sie die Input_file zuletzt.

Verwandte Themen