Получить определенную кучу строк - PullRequest
3 голосов
/ 12 января 2012

Мне нужна помощь в следующем: у меня есть такой файл с именем file-1

1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

2
++++++++++++
^^^+++++^^^^
^^^^^^^+++++
+++++^^^++^+

Теперь я хотел бы распечатать ту часть, в которой начальный номер такой же, как в другом файле с именем file-2. Допустим, что file-2 содержит значение 1, поэтому мне нужно получить следующий вывод:

1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

Кто-нибудь может мне что-то подсказать?

Ответы [ 3 ]

4 голосов
/ 12 января 2012
$ awk -v RS='' 'NR==FNR{split($0, a, /\n/); next}; $1 in a' file-{2,1}
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

file-2 содержит индексы построчно:

1
3
5

Объяснение:

  • RS='' рассказать awk прочитатьмногострочные записи
  • NR==FNR читать file-2 как одну строку, поэтому мы должны split на \n и сохранить результат в массиве a
  • next пропустить команды покоя, готовые к чтению file-1
  • $1 in a проверить, является ли file-1 первый столбец в массиве a
  • file-{2,1} мы должны сначала прочитать file-2, чтобы получить все индексы
0 голосов
/ 12 января 2012

С GNU-awk вы можете попробовать что-то вроде этого -

gawk 'NR==FNR {for (i=1;i<=NF;i++) a[$i];next} ($1 in a)' RS='\n\n' file-{2,1}

Пояснение:

  1. Мы устанавливаем разделитель записей на \n\n, используя встроенные переменные RS.
  2. Мы используем цикл for и сохраняем значения в нашем file-2 в массиве. Это определит, какие записи вы хотите извлечь из file-1.
  3. Мы проверяем первый столбец file-1. Если он присутствует в массиве, мы печатаем эту запись. Остальное мы не делаем.

Тест:

[jaypal:~/Temp] cat file-1
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++

2
++++++++++++
^^^+++++^^^^
^^^^^^^+++++
+++++^^^++^+

[jaypal:~/Temp] cat file-2
1
3
4

[jaypal:~/Temp] gawk 'NR==FNR {for (i=1;i<=NF;i++) a[$i];next} ($1 in a)' RS='\n\n' file-{2,1}
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++
0 голосов
/ 12 января 2012

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

sed 's|.*|/^&$/,/^$/p|' file2 | sed -nf - file1
1
++++++^^++++
++++++++++++
+++++++++^^^
^^++++++++++
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...