2011-01-19 5 views
0

Предположим, что у меня есть скрипт, foo.sh, который производит повторяющееся наборы данных, как это:Как фильтровать шаблон линии с помощью sed?

<name 1> 
<address 1> 
<mother's name 1> 
<pet's name 1> 
<comment 1> 
<name 2> 
<address 2> 
<mother's name 2> 
<pet's name 2> 
<comment 2> 
... 

Я хочу, чтобы извлечь 1-й и 3-й линии от каждого блока 5-линии, так что модифицированный результат выглядит следующим образом :

<name 1> 
<mother's name 1> 
<name 2> 
<mother's name 2> 
... 

Загвоздка в том, что нет никакой закономерности уникальной для этих линий, так что мне нужно фильтровать номера строк специально. Как это может быть сделано?

ответ

4

Использование GNU СЭД:

sed -n '1~5p;3~5p' file.txt 

От GNU СЭД руководство:

first~step 
    Match every step'th line starting with line first. For example, ``sed -n 1~2p'' 
    will print all the odd-numbered lines in the input stream, and the address 2~5 
    will match every fifth line, starting with the second. first can be zero; in 
    this case, sed operates as if it were equal to step. (This is an extension.) 
+0

Краткое объяснение того, что делает эта строка (что означают магические числа и значение аргумента) будет очень benificial –

3

Я не sed эксперт, но вы можете сделать это в Awk:

$ awk '(i==0 || i==2) { print } 
         { i = (i+1) % 5 } 
    ' < filename.txt 

Или в одной строке

$ awk '(NR%5==1 || NR%5==3)' < filename.txt 
+0

Это сработало, спасибо. – suszterpatt

+0

+1 для второго примера. Обратите внимание, что нет необходимости использовать перенаправление. AWK принимает имена файлов в качестве аргументов. –

1

Вы можете использовать awk?

awk 'NR % 5 == 1 || NR % 5 == 3' foofile 

Так в основном то, что происходит,

  • AWK открывает foofile.
  • он считывает через него строку за строкой
  • номер строки делится на пять, и если остаток равен 1 или 3 (т.е. первый или третья строка в блоке 5), то он выводит ту линию
+0

Было бы понятнее, если бы код включал «1» и «3». –

+0

Достаточно справедливо - изменено – jcuenod

0

Это может работать п или вы:

sed -n 'h;n;n;H;n;n;g;p' file 
Смежные вопросы