AWK / BASH: как сопоставить поле в одном файле с полем в другом? - PullRequest
5 голосов
/ 16 октября 2010

У меня есть 2 файла, первый содержит следующее:

...
John Allen Smith II 16 555-555-5555 10/24/2010
John Allen Smith II 3 555-555-5555 10/24/2010
John Allen Smith II 17 555-555-5555 10/24/2010
John Doe 16 555-555-5555 10/24/2010
Jane Smith 16 555-555-5555 9/16/2010
Jane Smith 00 555-555-5555 10/24/2010
...

, а второй - список имен, так что ...

...
John Allen Smith II
John Doe
Jane Smith
...

Возможно ли использоватьawk (или другая команда bash) для печати строк в первом файле, которые соответствуют любому имени во втором файле (имена могут повторяться в первом файле)

Бонус?Есть ли простой способ удалить эти повторяющиеся / повторяющиеся строки в первом файле?

Большое спасибо,

Tomek

Ответы [ 3 ]

3 голосов
/ 16 октября 2010

awk

#! /bin/bash
awk 'FNR==NR{!a[$0]++;next }{ b[$0]++ }
END{
  for(i in a){
    for(k in b){
      if (a[i]==1 && i ~ k ) { print i }
    }
  }
}' file1 file2
1 голос
/ 16 октября 2010

расширение ответа codaddict:

grep -f file2 file1 | sort | uniq

это удалит строки, которые абсолютно одинаковы, но побочный эффект (который может быть нежелательным) состоит в том, что ваш файл данных теперь будет отсортирован.Также требуется, чтобы линии были точно одинаковыми, что не так в данных вашего примера.Имена совпадают, но данные после тех же имен разные.uniq может использовать опцию подсчета полей или символов, но это не сработает с вашими данными, потому что ваши имена имеют переменную длину и переменное количество полей.Если вы знаете, что ваши поля данных всегда являются последними 3 полями в строке, то вы можете сделать это:

grep -f file2 file1 | sort | rev | uniq -f 3 | rev

ваш вывод будет только одно из каждого имени, но какое?самый низкий лексикографически, потому что он был отсортирован (sort необходим для правильной работы uniq).Если вы не хотите сначала сортировать его или должны быть осторожны с тем, какая из строк отброшена, то решение awk, perl, ruby ​​или python, вероятно, будет работать лучше всего с использованием ассоциативных массивов.

1 голос
/ 16 октября 2010

Вы можете использовать grep как:

grep -f file2 file1   # file2 is the file with the names.

Опция -f для grep получает шаблон для поиска из файла.

Чтобы удалить точные повторяющиеся строки из вывода, вы можете использовать sort как:

grep -f file2 file1 | sort -u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...