2016-12-20 10 views
1

teilen brauche ich Hilfe. Ich habe Datei vm.list:Wie man Liste mit Hilfe awk

VM-NAME1|WEEKDAY|2| 
VM-NAME2|WEEKDAY|4| 
VM-NAME3|WEEKDAY|3| 
VM-NAME4|WEEKDAY|4| 
VM-NAME5|WEEKDAY|4| 
VM-NAME6|WEEKDAY|1| 
VM-NAME7|WEEKDAY|1| 
VM-NAME8|WEEKDAY|4| 
VM-NAME9|WEEKDAY|2| 
VM-NAME10|WEEKDAY|4| 
VM-NAME11|WEEKDAY|4| 

I Liste teilen sich in neue Listen müssen in Abhängigkeit von 3 Wert und Wirkung Lauf:

LIST1: 
VM-NAME6 
VM-NAME7 

LIST2: 
VM-NAME1 
VM-NAME9 

LIST3: 
VM-NAME3 

LIST4: 
VM-NAME2 
VM-NAME4 
VM-NAME5 
VM-NAME8 
VM-NAME10 
VM-NAME11 

So gut wie es

for i in $(awk -F "|" '{print $3}' today.list | sort | uniq) 
    do echo $i 
    awk -F "|" '{ if ($3 == '$i') print $1 }' today.list 
done 

ich verstehen, was es falsch, aber ich habe keine Ideen

Antwort

4

geben Sie diesen awk Einstrich versuchen:

+0

cool :) Das wird die Ausgabe aber nicht sortieren. – sjsam

+1

wow, es ist sehr gut! – Nikita

+0

@Nikita: In der Tat kann es nicht besser sein als das. :) – sjsam

0

Eine Version, die erwartet, dass die Quelldatei in den Spalten 3 und 1 in Ordnung ist (behandelt durch sort in Prozesssubstitution).

$ awk -F\| '{ print q ($3!=p?ORS "LIST" $3 ":":"") }{ p=$3; q=$1 }' <(sort -t\| -k3 -k1 file) 

LIST1: 
VM-NAME6 
VM-NAME7 
LIST2: 
VM-NAME1 
VM-NAME9 
LIST3: 
VM-NAME3 
LIST4: 
VM-NAME10 
VM-NAME11 
VM-NAME2 
VM-NAME4 
VM-NAME5 

Es wird nicht der gesamte Datensatz im Speicher gespeichert.

0

Wenn Sie die Ausgabe in separaten Dateien wollen, mit dem Namen List{1..4}, können Sie diese verwenden:

$ awk -F'|' '{print $1 > "List" $3}' vm.list 

$ head -n100 List* # just a quick hack to print them with a header... 
==> List1 <== 
VM-NAME6 
VM-NAME7 

==> List2 <== 
VM-NAME1 
VM-NAME9 

==> List3 <== 
VM-NAME3 

==> List4 <== 
VM-NAME2 
VM-NAME4 
VM-NAME5 
VM-NAME8 
VM-NAME10 
VM-NAME11 
Verwandte Themen