ファイル内で最後に出現したパターンを検索し、最後のパターンを含む行以降をすべて削除しようとしています。awkまたはsedを使用して可能かどうか疑問に思います。前もって感謝します。
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
望ましい出力:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
ファイル内で最後に出現したパターンを検索し、最後のパターンを含む行以降をすべて削除しようとしています。awkまたはsedを使用して可能かどうか疑問に思います。前もって感謝します。
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
望ましい出力:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
救助へ:
$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
逆にファイルを連結して印刷します。awk
前の質問に対する私の回答で説明されています。 awk または sed を使用して、パターンを含むパターンの前のすべてを削除します。もう一つの例:
$ 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
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
私はこの行を持っています、あなたの要件に合うはずです:
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
これはうまくいくかもしれません(GNU sed):
sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file