grep список в файл из нескольких столбцов и получение полностью совпадающих строк - PullRequest
0 голосов
/ 06 сентября 2018

не знаю, как задать этот вопрос, но пример наверняка прояснит.Предположим, у меня есть этот файл:

$ cat intoThat 
a   b
a   h
a   l
a   m
b   c
b   d
b   m
c   b
c   d
c   f
c   g
c   p
d   h
d   f
d   p

и этот список:

cat grepThis 
a
b
c
d

Теперь я хотел бы grepThis intoThat , и я бы хотелсделайте это:

$grep -wf grepThis intoThat

, который выдаст следующий вывод:

**a b**
a   h
a   l
a   m
**b c**
**b d**
b   m
**c b**
**c d**
c   f
c   g
c   p
d   h
d   f
d   p

теперь звездочки используются для выделения тех строк, которые я хотел бы, чтобы grep возвратил.Это строки с полным соответствием , но ... как сказать grep (или awk или что-то еще), чтобы получить только эти строки? Конечно, возможно, что некоторые строки не соответствуют ни одному шаблону, например, в файле intoThat у меня могут быть другие буквы, такие как g, h, l, s, t и т. Д. *

1 Ответ

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

С awk вы можете сделать:

awk 'NR==FNR{ seen[$0]++; next } ($1 in seen && $2 in seen)' grepThis intoThat
a   b
b   c
b   d
c   b
c   d
  • NR устанавливается в 1, когда первая запись считывается awk и увеличивается при каждом следующем чтении записей в одном или нескольких входных файлах, пока не будут прочитаны все записи / строки.
  • FNR устанавливается в 1, когда первая запись считывается awk и увеличивается при каждом следующем чтении записей в текущем файле и сбрасывается до 1 для следующего входного файла, если несколько входных файлов.
  • , поэтому NR == FNR всегда является истинным условием для первого входного файла, и последующий блок будет выполнять действия только с первым файлом.

  • seen - это связанный массив awk с именем seen (вы можете использовать другое имя по своему желанию) с ключом всей строки $0 и значением с вхождениями каждой строки ( этот способ обычно используется для удаления дублированных записей в awk тоже ).

  • Токен next пропускает выполнение остальных команд, и они будут фактически выполняться только для следующего файла (ов), кроме первого.

  • В следующем (....) мы просто проверяем, присутствуют ли оба столбца $ 1 и $ 2 в массиве, и если да, то они поступают в вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...