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
сжимает несколько пробелов в один пробел и заменяет их запятой (,
)