リクエストがあります。私のファイルの内容が次のようになるとしましょう。
a
b
c
d
e
f
d
e
f
b
から2番目まで行を繰り返し印刷したいと思いますd
。これを行うawkコマンドはありますか?
出力は
b
c
d
e
f
d
初めてならb
命令はわかります。
awk '/b/,/d/' file.txt
しかし、2回目を繰り返すと、一致する点にテキストを印刷したいと思います。コマンドを一行で書きたいです。
答え1
1つの方法は、フラグとカウンタを使用して追跡することです。
$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
/b/{f=1; c=0}
開始一致フラグを設定し、カウンタを初期化します。f;
長いフラグが設定されている場合、入力レコードを印刷する/d/ && ++c==2{f=0}
終了文字列が2番目に一致した場合、フラグをクリアします。awk '/b/{f=1} f; /d/ && ++c==2{exit}'
抽出するセットが1つしかない場合は、単純化できます。
最後の一致に一致が2つない場合は、入力が終了するまで印刷されます。
$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10
答え2
- より読みやすいコード。文字数を追跡してください。
- b = 1とd < = 2の数で印刷します。
dのカウントが2に達すると停止します。
awk '{ a[$1]++; if(a["b"]==1 && a["d"]<=2){ print; } if(a["d"]==2){ a["d"]=10 } }' file.txt