Unix объединяет более двух файлов - PullRequest
4 голосов
/ 09 февраля 2012

У меня есть три файла, каждый с идентификатором и значением.

sdt5z@fir-s:~/test$ ls
a.txt  b.txt  c.txt
sdt5z@fir-s:~/test$ cat a.txt 
id1 1
id2 2
id3 3
sdt5z@fir-s:~/test$ cat b.txt 
id1 4
id2 5
id3 6
sdt5z@fir-s:~/test$ cat c.txt 
id1 7
id2 8
id3 9

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

id1 1 4 7
id2 2 5 8
id3 3 6 9

... желательно с использованием одной команды.

Мне известны команды соединения и вставки. Paste будет дублировать столбец id каждый раз:

sdt5z@fir-s:~/test$ paste a.txt b.txt c.txt 
id1 1   id1 4   id1 7
id2 2   id2 5   id2 8
id3 3   id3 6   id3 9

Объединение работает хорошо, но только для двух файлов одновременно:

sdt5z@fir-s:~/test$ join a.txt b.txt 
id1 1 4
id2 2 5
id3 3 6
sdt5z@fir-s:~/test$ join a.txt b.txt c.txt 
join: extra operand `c.txt'
Try `join --help' for more information.

Я также знаю, что вставка может принимать STDIN в качестве одного из аргументов, используя "-". Например, я могу повторить команду соединения, используя:

sdt5z@fir-s:~/test$ cut -f2 b.txt | paste a.txt -
id1 1   4
id2 2   5
id3 3   6

Но я все еще не уверен, как изменить это, чтобы разместить три файла.

Поскольку я делаю это внутри сценария perl, я знаю, что могу сделать что-то вроде помещения этого в цикл foreach, что-то вроде join file1 file2> tmp1, join tmp1 file3> tmp2 и т. Д. Но это становится грязным, и Я хотел бы сделать это с одним вкладышем.

Ответы [ 4 ]

12 голосов
/ 09 февраля 2012

join a.txt b.txt|join - c.txt

должно быть достаточно

1 голос
/ 09 февраля 2012

Поскольку вы делаете это внутри сценария Perl , есть ли какая-то конкретная причина, по которой вы НЕ выполняете работу в Perl, а не порождаете в оболочке?

Что-то вродеНЕ ИСПЫТАНО! Будьте бдительны:)

0 голосов
/ 16 апреля 2013
pr -m -t -s\  file1.txt file2.txt|gawk '{print $1"\t"$2"\t"$3"\t"$4}'> finalfile.txt

Учитывая, что файл1 и файл2 имеют 2 столбца, а 1 и 2 представляют столбцы из файла1, а 3 и 4 представляют столбцы из файла 2.

Таким же образом можно распечатать любой столбец из каждого файла, и этопримет любое количество файлов в качестве входных данных.Например, если в вашем файле1 есть 5 столбцов, то первым столбцом файла2 будет $ 6.

0 голосов
/ 09 февраля 2012

perl -lanE'$h{$F[0]} .= " $F[1]" END{say $_.$h{$_} foreach keys %h}' *.txt

Должно работать, не могу проверить это, поскольку я отвечаю со своего мобильного телефона. Вы также можете отсортировать вывод, если поставить sort между foreach и keys.

...