awk + печать строк от первой строки до слова соответствия


8

Я хочу напечатать все строки из файла до совпадения, пожалуйста, совет, как сделать это с помощью awk

например

Я хочу напечатать все строки до слова PPP

заметьте, что первая строка должна отличаться от AAA (любое слово)

cat file.txt

AAA   ( the first line/word chuld be any word !!!!! )
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP
MMM
(((
&&&

так что мне нужно получить это

AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

другой пример (хочу напечатать до KJGFGHJ)

 cat file.txt1

 HG
 KJGFGHJ
 KKKK

поэтому мне нужно получить

 HG
 KJGFGHJ

Ответы:


12

Пытаться:

$ awk '1;/PPP/{exit}' file
AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

5
То же самое с выше через sed:sed '/PPP/q' infile
Костас

@ Костас: Да, ОП хочет awk, поэтому я не даю другим инструментам.
cuonglm

1 в начале похож на полный оператор "// {print $ 0}", который всегда совпадает. awk не печатает без него.
Сидермол

@cidermole: Не совсем. 1это как {print $0}. Также обратите внимание, что //это пустой шаблон и результат не указан. Это работа в gawk, mawkBrian Kernighan собственной версии, но не в nawk, oawkиз сундука с инструментами семейной реликвии.
cuonglm

Спасибо за решение Sed! Я просто хочу, чтобы это было сделано, и мне плевать на инструмент
Аарон Макмиллин

6

В качестве альтернативы используйте шаблон диапазона, соответствующий первой строке (NR, равный 1), до первого совпадения 'PPP' в строке

awk 'NR==1,/PPP/' file

если линия должна точно соответствовать «PPP», используйте только

awk 'NR==1,/^PPP$/' file

Если вы хотите сделать то же самое для каждого файла в списке аргументов, используйте переменную FNR, которая сбрасывается в 1 для первой строки каждого обработанного файла

awk 'FNR==1,/PPP/' file1 file2 ...

2

Как сказал OP, его первая строка или слово файла может содержать любое слово (например, PPPсамо по себе), поэтому вам нужно проверить это и отсканировать первую строку от совпадения и избежать awkвыхода из нее.

Тогда вы можете попробовать это:

Входной файл:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
345
PPP
%%%

Команда:

awk '1;/PPP/{if (NR>1) exit}' file

Вывод:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.