awk: найти несколько строк и распечатать - PullRequest
0 голосов
/ 22 сентября 2018

Я хочу напечатать строку, содержащую «число» и строки между «началом» и «концом» в моем входном файле и распечатать на том же выходном файле.

Я написал этот код

awk -v string="number" '$0~string' Input >> Output
awk ' /start/ {flag=1;next} /end/{flag=0} flag { print $0}' Input >> Output

Тем не менее, это дало мне этот вывод, и это не то, что я действительно хочу

number 1
number 2
start
line 7
line 8
line 9
end
start
line 14
line 15
line 16
end

Хотелось бы, чтобы я

inputdata:

line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
line 15
line 16
end

вывод:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Лично я никогда не использовал бы выражение диапазона, поскольку это делает код для тривиальных вещей немного более коротким, но затем требует полного переписывания или дублирования условий при изменении ваших требований.Вместо этого я бы всегда использовал флаг:

$ awk '/start/{f=1} f || /number/{print} /end/{f=0}' file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

f для found, а не для flag - флаг - это тип переменной, найденный - это то, что он означает.по сравнению с изменением числа на что-то еще, вот 1 интерпретация того, что вы можете иметь в виду под этим:

$ awk '/start/{f=1} f || sub(/number/,"foobar"){print} /end/{f=0}' file
foobar 1
start
line 7
line 8
line 9
end
foobar 2
start
line 14
line 15
line 16
end
0 голосов
/ 22 сентября 2018

В awk:

$ awk '/number/;/start/,/end/' file

Вывод:

number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
line 15
line 16
end

Однако в решении есть проблема.Если внутри начального блока есть number, он будет напечатан дважды.Если дело обстоит с данными, решение @ Ravinder - это исправление.

0 голосов
/ 22 сентября 2018

Не могли бы вы попробовать следующее, это позволит избежать печати строки number 2 раза, если она находится между start и end тоже.

awk '/start/,/end/{print;next}; /number/'  Input_file

Допустим, следующим является Input_file (Я добавил небольшое редактирование, добавив в него строку number).

cat Input_file
line 1
line 2
line 3
number 1
line 4
line 5
line6
start
line 7
line 8
line 9
end
line 10
number 2
line 11
line 12
line 13
start
line 14
number 13
line 15
line 16
end


awk '/start/,/end/{print;next}; /number/'  Input_file
number 1
start
line 7
line 8
line 9
end
number 2
start
line 14
number 13
line 15
line 16
end
0 голосов
/ 22 сентября 2018

Использование sed

sed -n '/number/p;/start/,/end/p' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...