awk を使用して、1 つの一致の行を別の一致の 2 番目のインスタンスとして印刷します。

awk を使用して、1 つの一致の行を別の一致の 2 番目のインスタンスとして印刷します。

リクエストがあります。私のファイルの内容が次のようになるとしましょう。

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

  1. より読みやすいコード。文字数を追跡してください。
  2. b = 1とd < = 2の数で印刷します。
  3. dのカウントが2に達すると停止します。

    awk '{ a[$1]++;
        if(a["b"]==1 && a["d"]<=2){
            print;
        }
        if(a["d"]==2){
           a["d"]=10
        }
    }' file.txt
    

関連情報