Использование sed (или других программ командной строки) для удаления всех остальных строк X - PullRequest
0 голосов
/ 05 июня 2018

У меня есть огромный текстовый файл, который содержит несколько итераций одной и той же вещи в разное время, с базовой структурой:

Header (5 lines)
Data (thousands of lines)
Header (5 lines)
Data (thousands of lines)
Header (5 lines)
Data (thousands of lines)

Это повторяется и продолжается некоторое время.

Я хочу отбраковать этот файл, удалив все остальные наборы заголовка + данные.Я думал, что буду использовать sed, но я не могу понять, как.

Может быть полезно, чтобы каждый «цикл» начинался с одной и той же строки (для целей этого примера представьтетам написано Program X output) и эта точная строка появляется только один раз, в начале каждого "цикла".

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Следите за тем, как часто вы видите ключевые слова, и печатайте, только если это число является нечетным числом:

awk '/Program X output/ {n++} n%2 == 1' <<END
Program X output
a
b
c
Program X output
d
e
Program X output
f
g
h
i
j
Program X output
m
n
o
END
Program X output
a
b
c
Program X output
f
g
h
i
j
0 голосов
/ 06 июня 2018

Это может работать для вас (GNU sed):

sed -r '/Program X output/{x;s/^/x/;x};G;/\n(x{2})*$/!P;d' file

При обнаружении строки заголовка добавьте 1 к счетчику в области удержания (HS).Добавьте HS к каждой строке и напечатайте только первую строку в пространстве образца (PS), если счетчик кратен необходимому количеству.

0 голосов
/ 05 июня 2018

Похоже, все, что вам нужно, это:

awk '/Program X output/ && c++{exit} 1' file

например,

$ seq 50 | awk '/2/ && c++{exit} 1'
1
2
3
4
5
6
7
8
9
10
11

Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы уточнить ваши требования и показать нам краткий, тестируемый образецввод и ожидаемый вывод.

...