Awk - печатает n последних чередующихся строк, содержащих ключевое слово - PullRequest
0 голосов
/ 07 февраля 2019

Предположим, многострочный текстовый файл file, некоторые строки которого начинаются с ключевого слова baz.

$ cat file
foo bar
baz qux   # line to be deleted
foo bar
foo bar baz
baz
baz qux quux
foo bar

Как отобразить все эти строки, не начинающиеся с ключевого слова, а такжеn последние строки, начинающиеся с ключевого слова?

Если n = 2 , результат должен выглядеть следующим образом:

$ sought_command file
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar

Я считаю, что awk может быть путь сюда.Что-то вроде:

counter=1
tac file | awk '{
if ($1 =="baz" && counter<=2)
    {print $0; counter=$((counter+1));}
else if ($1 =="baz" && counter>2)
    {next;}
else
    {print $0;}
}' | tac

Что мне нужно изменить в приведенном выше коде, чтобы эта работа работала?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019
$ tac file | awk '$1!="baz" || c++<2' | tac
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar
0 голосов
/ 07 февраля 2019

Если вы хотите попробовать Perl, вот отдельное решение.

$ cat michael.txt
foo bar
baz qux   # line to be deleted
foo bar
foo bar baz
baz
baz qux quux
foo bar
$ perl -0777 -ne ' $x++ for(/^baz/gm); $y=$x-2; while( $y-- ) { s/^baz.+?\n//m } ; print ' michael.txt
foo bar
foo bar
foo bar baz
baz
baz qux quux
foo bar
$
0 голосов
/ 07 февраля 2019

Вы не можете манипулировать или получать доступ к своим переменным Bash из Awk, так же как вы не можете получить доступ к переменной внутри программы на C из Bash.

tac file |
awk '$1 =="baz" && ++counter<=2 {print; next}
     $1 !="baz"' |
tac
...