bash — получить все строки с одинаковым значением столбца в двух файлах

У меня есть два текстовых файла, в каждом из которых по 3 поля. Мне нужно получить строки с одинаковым значением в третьем поле. Значение 3-го поля уникально в каждом файле. Пример:

файл1:

1 Иоанн 300
2 Эли 200
3 Крис 100
4 Энн 600

файл2:

6 Кевин 250
7 Нэнси 300
8 Джон 100

выход:

1 Джон 300
7 Нэнси 300
3 Крис 100
8 Джон 100

Когда я использую следующую команду:

cat file1 file2 | sort -k 3 | uniq -c -f 2 

Я получаю только одну строку из входного файла с повторяющимся значением. Мне нужны оба!


person ahb65    schedule 30.09.2014    source источник


Ответы (2)


этот однострочник дает вам такой результат:

awk 'NR==FNR{a[$3]=$0;next}$3 in a{print a[$3];print}' file1 file2
person Kent    schedule 30.09.2014
comment
@user3490988 user3490988 awk сначала читает файл1, сохраняет все строки в хеш-таблице, ключ — 3-й столбец, значение — строка. затем обрабатывает 2-й файл, проверяет, есть ли 3-й столбец file2.line в хеш-таблице, если он найден, печатает соответствующую строку (a[$3]) и файл2.line. Если вы не знаете синтаксиса awk, его сложно объяснить очень подробно. Я предлагаю вам прочитать справочную страницу awk. - person Kent; 01.10.2014

Мое решение

join -1 3 -2 3 <(sort -k3 file1) <(sort -k3 file2) | awk '{print $2, $3, $1; print $4, $5, $1}'

or

join -1 3 -2 3 <(sort -k3 file1) <(sort -k3 file2) -o "1.1 1.2 0 2.1 2.2 0" | xargs -n3
person Vytenis Bivainis    schedule 30.09.2014