Объединение двух файлов в один на основе первого столбца - PullRequest
3 голосов
/ 01 ноября 2010

У меня есть два файла, оба в одном формате - два столбца, каждый из которых содержит число, например:

файл 1

1.00    99
2.00    343
3.00    34
...
10.00   343

файл 2

1.00    0.4
2.00    0.5
3.00    0.34
...
10.00   0.9

и я хочу сгенерировать следующий файл (используя, awk, bash perl):

1.00    99      0.4 
2.00    343     0.5      
3.00    34      0.34
...
10.00   343     0.9

спасибо

Ответы [ 3 ]

7 голосов
/ 01 ноября 2010
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 указал, что его следует использовать, если он доступен.

2 голосов
/ 02 ноября 2010

A Perl-раствор

perl -anE 'push @{$h{$F[0]}}, $F[1]; END{ say "$_\t$h{$_}->[0]\t$h{$_}->[1]" for sort{$a<=>$b} keys %h }' file_1 file_2 > file_3

Хорошо, глядя на awk-oneliner, это короче, чем моя первая попытка, и у него более хороший выход, чем у awk-oneliner, и он не использует 'pipe sort -n':

perl -anE '$h{$F[0]}="$h{$F[0]}\t$F[1]"; END{say "$_$h{$_}" for sort {$a<=>$b} keys %h}' file_1 file_2

И однострочники ведут себя иначе, чем пример соединения, если во втором столбце в первом файле есть записи без значения.

0 голосов
/ 21 декабря 2014

Вы можете сделать это с помощью Alacon - утилиты командной строки для Alasql базы данных.

Он работает с Node.js, поэтому вам нужно установить Node.js , а затем Alasql пакет:

Для объединения двух данных из файлов, разделенных табуляцией, вы можете использовать следующую команду:

> node alacon "SELECT * INTO TSV("main.txt") FROM TSV('data1.txt') data1 
                   JOIN TSV('data2.txt') data2 USING [0]"

Это одна очень длинная строка. В этом примере все файлы имеют данные в листах «Лист1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...