join file1 file2
Предполагается, что файлы отсортированы в поле соединения.Если это не так, вы можете сделать это:
join <(sort -V file1) <(sort -V file2)
Вот версия AWK (sort
компенсирует недетерминированный порядок массива AWK):
awk '{a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2 | sort -V
Кажется, корочеи более читабельный, чем ответ Perl.
В gawk
4 вы можете установить порядок обхода массива:
awk 'BEGIN {PROCINFO["sorted_in"] = "@ind_num_asc"} {a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2
, и вам не придется использовать утилиту sort
,@ind_num_asc
- Индекс Числовой Восходящий.См. Управление обходом массива и сортировкой массива и Использование предопределенных заказов на сканирование массива с gawk .
Обратите внимание, что -V
(--version-sort
) в командах sort
выше требуется GNU sort
из coreutils 7.0 или новее.Спасибо, что @simlev указал, что его следует использовать, если он доступен.