awk を使用してパターンの一部または全部を一致させます。

awk を使用してパターンの一部または全部を一致させます。

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

おすすめ記事