awkのマルチパターンマッチングについて理解できない小さな問題があります。次のawk行があります。
awk '/pat1/{v1=$4; next} /pat2/{v2=$5; next} /pat3/{v3=$6;next} /pat4/{v4=$5; print v1," ",v2," ",v3" ",v4}' myfile.out
これはすべて一致するため、私が望む結果(各一致に対して1行に数学結果を印刷)を提供します。パターンの1つが存在しない場合は、何も一致しません。
したがって、すべてが一致すると、期待した結果が得られます。
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
.
.
.
各行ごとにpatX
異なる値があります!
このスペースを空にしていないように見える場合は、awkにこれらのパターンを見つけるように指示する方法はありますか?
たとえば、最初のインスタンスで更新されている文書にpat3
まだ存在しない場合は、次のようにします。pat4
pat1 pat2
pat1 pat2 pat3 ------> (here let's assume that pat3 has made an appearange)
pat1 pat2 pat3 pat4 ------> (here pat4 started to appear too)
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
.
.
.
awkでできますか?
編集:以下は私が直面している2つの例のシナリオです。私のファイルは空の状態で始まり、いくつかのパターンをフィルタリングする必要があるデータで埋められます。すべてのパターンが最初から現れるわけではありません。したがって、ファイルは次のように始まります。
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
上記のawkコマンドを使用すると、pat4
まだ存在しないため、空の結果が得られます。時間が経つと結局現れます。
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
some text here pat1
some more text here
some more text here pat2
some more text here and pat3
some more text here pat4
このコマンドの結果はawk
期待どおりに表示されます。
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
しかし、最初に得たかった結果は次のとおりです。
pat1 pat2 pat3
今より明確になることを願っています。 (上記のawkコマンドをより簡単にするために再構築してテストしました。)
ベストアンサー1
次のようなものが必要なようです。
$ cat tst.awk
BEGIN { OFS=" " }
{ sub(/\r$/,"") }
( ($NF ~ /pat1/) && (state == 0) ) ||
( ($NF ~ /pat2/) && (state == 1) ) ||
( ($NF ~ /pat3/) && (state == 2) ) ||
( ($NF ~ /pat4/) && (state == 3) ) {
v[++state] = $NF
}
state == 4 {
print v[1], v[2], v[3], v[4]
state = 0
}
$ awk -f tst.awk file
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4
pat1 pat2 pat3 pat4