5

こんにちは、2 つのパターンを見つけて、中間に 3 番目のパターンがある場合にのみ、それらの間のデータをファイルに出力できる awk を探しています。例えば:

Start
1
2
middle
3
End
Start
1
2
End

And the output will be:
Start
1
2
middle
3
End

Web awk '/patterns1/, /patterns2/' path > text.txt で見つけましたが、途中で 3 番目のパターンを出力するだけで済みます。

4

5 に答える 5

3

この awk は動作するはずです:

awk '$1=="Start"{ok++} ok>0{a[b++]=$0} $1=="middle"{ok++} $1=="End"{if(ok>1) for(i=0; i<length(a); i++) print a[i]; ok=0;b=0;delete a}' file

Start
1
2
middle
3
End

拡張:

awk '$1 == "Start" {
   ok++
}
ok > 0 {
   a[b++] = $0
}
$1 == "middle" {
   ok++
}
$1 == "End" {
   if (ok > 1)
      for (i=0; i<length(a); i++)
         print a[i];
   ok=0;
   b=0;
   delete a
}' file
于 2013-08-19T17:43:24.663 に答える
3

いくつかのフラグを使用するだけawkです:

/Start/ {
    start_flag=1
}

/middle/ {
    mid_flag=1
}

start_flag {
    n=NR;
    lines[NR]=$0
}

/End/ {
    if (start_flag && mid_flag)
        for(i=n;i<NR;i++)
            print lines[i]
    start_flag=mid_flag=0
    delete lines
}
于 2013-08-19T17:44:19.447 に答える
3

awk user000001 を変更しました

awk '/middle/{printf "%s%s\n",$0,RT}' RS="End" file

編集:開始タグのテストを追加

awk '/Start/ && /middle/{printf "%s%s\n",$0,RT}' RS="End" file
于 2013-08-19T18:06:27.643 に答える
2

これは、最新の awk で動作します。

awk '/Start/{f=1;rec=""} f{rec=rec $0 ORS} /End/{if (rec~/middle/) printf "%s",rec}' file

RS を "End" に設定するソリューションは gawk 固有のものであり、これで問題ないかもしれませんが、言及する価値があることは間違いありません。

于 2013-08-19T19:21:42.077 に答える