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