2

ファイル内で最後に出現したパターンを検索し、最後のパターンを含む行以降をすべて削除しようとしています。awkまたはsedを使用して可能かどうか疑問に思います。前もって感謝します。

aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 

望ましい出力:

aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
4

4 に答える 4

7

tac救助へ:

$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd

もう一つの例:

$ cat a
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
qqqq eeee rrrr
$ tac a | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
于 2013-09-27T11:28:38.580 に答える
2
awk '
    BEGIN { ARGV[ARGC++] = ARGV[ARGC-1] }
    NR==FNR { if (/pattern/) lastLine = NR; next }
    { print }
    FNR == lastLine { exit }
' file

上記の postfix がどのように機能するかを示すには (以下のコメントを参照):

$ awk 'BEGIN{ i=3; a[i++] = i; for (j in a) print j, a[j]; print i }'
3 3
4
于 2013-09-27T11:30:03.097 に答える
1

私はこの行を持っています、あなたの要件に合うはずです:

awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' file

私は小さなテストをしました:

kent$  cat f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 
aaaaaa pattern dddddd
111
222

kent$  awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 
aaaaaa pattern dddddd
于 2013-09-27T11:31:47.827 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file
于 2013-09-27T19:30:16.647 に答える