次のファイルがあります。
$ 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
しかし、awk
MartinまたはSP ASICが提供するより明確なアプローチを好むかもしれません。