awk mehrere Muster übereinstimmen und in einer Zeile drucken

8

Ich habe die folgende Datei:

$ cat disk.out
disk0
fcs0
text
text
text
disk1
fcs1
text
text
text
text
...

Was ich erreichen möchte, ist, "disk" + "fcs" abzugleichen und dann das Paar in einer Zeile wie folgt zu drucken:

disk0,fcs0
disk1,fcs1
...

Also stimme ich "disk" und "fcs" mit ab awkund ändere das Trennzeichen für den Ausgabedatensatz auf ",". `

$ awk '/disk|fcs/' ORS="," disk.out
disk0,fcs0,disk1,fcs1,

Das Problem ist, dass alle Übereinstimmungen in einer Zeile und mit einem nachgestellten Zeichen gedruckt werden ,. Wie kann ich nur pro Spiel in einer Zeile drucken? So was:

disk0,fcs0
disk1,fcs1
...
Fightingurukhai
quelle

Antworten:

9

Sie müssen die Zeile "Disk" speichern (ohne sie zu drucken), bis Sie die nächste Zeile "fcs" finden:

awk '/disk/{ DISK=$0; next } /fcs/{ print DISK "," $0 }'

Das Problem bei Ihrem Ansatz besteht darin, dass entweder Zeilen mit "disk" oder "fcs" gedruckt werden, ohne diese Zeilen zu kombinieren .

Bearbeiten: Das Skript von sp asic ist insofern robuster, als es ignoriert wird

disk3
text
fcs3

Mein Skript würde in diesem Fall gerne "disk3, fcs3" drucken.

Martin Nyolt
quelle
8
$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1
Sundeep
quelle
6

Wenn es immer in diesem Format ist (ein fcs für eine Festplatte, fcs immer nach der Festplatte), können Sie auf Folgendes verzichten awk:

grep -F -e disk -e fcs file | paste -d , - -

Oder:

awk '(/disk/ && ORS=",") || (/fcs/ && ORS=RS)' file

Trotzdem awkbevorzugen Sie möglicherweise einen besser lesbaren Ansatz, wie er von Martin oder Sp asic angegeben wird.

Stéphane Chazelas
quelle