awkマルチパターンマッチングと1行印刷

awkマルチパターンマッチングと1行印刷

次のファイルがあります。

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

私が達成したいのは、「disk」+「fcs」を一致させてから、このペアを次のように1行で印刷することです。

disk0,fcs0
disk1,fcs1
...

そのため、「disk」と「fcs」を一致させ、awk出力レコード区切り文字を「,」に変更しました。 `

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

問題は、すべての一致を1行に印刷し、それに続くものを印刷することです,。各一致を1行にどのように印刷しますか?このように:

disk0,fcs0
disk1,fcs1
...

答え1

次の「fcs」行が見つかるまで、「disk」行を印刷せずに保存する必要があります。

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

あなたの方法の問題は、それが印刷されることです誰でも「disk」または「fcs」に一致する行は次のとおりです。結合するそのライン。

編集する:sp asicスクリプト無視するので、より強力です。

disk3
text
fcs3

この場合、私のスクリプトは「disk3、fcs3」を印刷します。

答え2

$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1

string ~ /regexp/正規表現(ここ)が与えられた文字列と一致することを確認してください。この場合、文字列はdisk変更可能です。ここでは、2つの条件を組み合わせるためにa演算子を使用します。最初の条件と2番目の条件の両方が真の&&場合にのみ印刷が行われます。/fcs/a ~ /disk/

答え3

常にこの形式の場合(ディスクごとに1つのfcs、fcsは常にディスクの後に来る)、次のことなく実行できますawk

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

または:

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

しかし、awkMartinまたはSP ASICが提供するより明確なアプローチを好むかもしれません。

関連情報