Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unix join on more than two files

I have three files, each with an ID and a value.

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

I want to create a file that looks like this...

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

...preferably using a single command.

I'm aware of the join and paste commands. Paste will duplicate the id column each time:

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

Join works well, but for only two files at a time:

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.

I'm also aware that paste can take STDIN as one of the arguments by using "-". E.g., I can replicate the join command using:

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

But I'm still not sure how to modify this to accomodate three files.

Since I'm doing this inside a perl script, I know I can do something like putting this inside a foreach loop, something like join file1 file2 > tmp1, join tmp1 file3 > tmp2, etc. But this gets messy, and I would like to do this with a one-liner.

like image 874
Stephen Turner Avatar asked Dec 13 '22 05:12

Stephen Turner


1 Answers

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

should be sufficient

like image 156
Sergey Benner Avatar answered Jan 07 '23 14:01

Sergey Benner