Unix Compare Два CSV-файла с использованием comm

У меня есть два файла CSV. 1.csv файлы имеют 718 записей и 2.csv имеет 68000 записей.

#cat 1.csv
#Num    #Name  
 1      BoB
 2      Jack
 3      John
 4      Hawk
 5      Scot
 ...........

#cat 2.csv
#Num #Name
1   BoB
2   John
3   Linda
4   Hawk
5   Scot
........

Я умел сравнивать два файла, когда только один столбец (Names) доступен в обоих и получить соответствующий names,

#comm -12 <(sort 1.csv) <(sort 2.csv)

Теперь я хотел бы проверить, если Num в 1.csv совпадает с Num в 2.csvЧто такое "Имена" из обоих csv файлы для этого совпали Num?

Result : 

1,Bob,Bob
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
..........

Как это сделать, используя comm?

2 ответа

Решение

Вы можете использовать join команда для выполнения внутреннего соединения для 2 CSV-файлов на 1-м поле, т.е. число. Вот пример:

$ cat f1.csv 
1      BoB
2      Jack
3      John
4      Hawk
5      Scot
6      ExtraInF1
$ cat f2.csv 
1   BoB
3   Linda
4   Hawk
2   John
5   Scot
7   ExtraInF2
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv)
1 BoB BoB
2 Jack John
3 John Linda
4 Hawk Hawk
5 Scot Scot
$ join <(sort -t ' ' -k 1 f1.csv) <(sort -t ' ' -k 1 f2.csv) | tr -s ' ' ,
1,BoB,BoB
2,Jack,John
3,John,Linda
4,Hawk,Hawk
5,Scot,Scot
$

Обратите внимание, что я добавил несколько фиктивных строк (номера 6 и 7), а также обратите внимание, что они не появились в выходных данных, поскольку их нет в обоих файлах.

<(sort -t ' ' -k 1 f1.csv) означает замену процесса, т. е. заменить вывод процесса в этом месте. sort с разделителем в качестве пробела (-t ' ') и по первому ключу, т.е. по первому столбцу (-k 1) а также join по умолчанию выполняет внутреннее объединение 1-го столбца обоих файлов.

Еще один вкладыш для внутреннего соединения с использованием join команда

join -1 1 -2 1 <(sort 1.csv) <(sort 2.csv) |  tr -s ' ' ,

-1 2   : sort on file 1, 1st field
-2 1   : sort on file 2, 1st field

tr -s сжимает несколько пробелов в один пробел и заменяет их запятой (,)

Другие вопросы по тегам