変数に格納されている特定の行番号でawkを実行する方法

変数に格納されている特定の行番号でawkを実行する方法

bar発生後の最初の発生の行番号を取得したいと思いますfoo

これはwhileファイル全体に対してループとして実行する必要があります。このように:

テストファイル:

bar foo
xxx
xxx
xxx
bar
bar
xxx
bar
xxxx
xxx
xx
bar foo
xxx
xxx
bar foo
xxx
xxx
xxx
xxx
xxx
bar

bar私は次を見つける必要がfooありますが、最初のものと同じ行にはありませんfoo。次のようなものがあればbar foo探したいです。 15行目が見つかりません。

以下を返す必要があります。

linenumbersfoo: 1 12 15
linenumbersbar: 5 15 21

私のコード:

linenumbersfoo=($(awk '/foo/ {print FNR}' test_file.sh))
length="${#linenumbersfoo[@]}"

while [[ $COUNTERR -lt length  ]]; do
number=$((${linenumbersfoo["$COUNTERR"]}))

linenumbersbar[$COUNTERR]=$(awk '"$number"<=NR, /bar/ {print FNR;exit;}' test_file.sh)

let COUNTERR=COUNTERR+1 
done

echo "${linenumbersfoo[@]}"

echo "${linenumbersbar[@]}"

私は得る:

linenumbersfoo: 1 12
linenumbersbar: 1 1

問題は変数のようです。たとえば、代わりに書くとうまくnumberいきます。5$number

どんな助けでも大変感謝します!

ベストアンサー1

このフィールドはfooこのフィールドと共に表示されるため、bar非常に明確なアルゴリズムを作成できます。

awk '/bar/ {A[NR]=0} /foo/ {A[NR]++} END {for(i in A) print i,A[i]}' file
1 1
5 0
6 0
8 0
12 1
15 1
21 0

2番目の列を移動すると、1 - trueと0 - falseを示す行番号を取得できます。

1 
5 1
6 0
8 0
12 0
15 1
21 1
   0

しよう:

awk '/bar/ {A[NR]=0} /foo/ {A[NR]++} END {for(i in A) {if(A[l]) print i; l = i}}' file
5
15
21

勝利!最初の行を表示し、それを目的の形式(フォーマットされた出力)に変換します。

awk '
BEGIN   {printf "linenumbersfoo:"}
/bar/   {A[NR]=0}
/foo/   {A[NR]++; printf FS NR} 
END     {printf "\nlinenumbersbar:"
        for(i in A) {if(A[l]) printf FS i
                l = i}
                print ""
        }
' file
linenumbersfoo: 1 12 15
linenumbersbar: 5 15 21

おすすめ記事