Bash join命令

时间:2012-01-13 11:13:02

标签: linux bash unix join

Infile1:

1 a
3 c
4 d
6 f

Infile2:

1 a 
2 b
5 e
6 f
7 g
8 h

如何使用unix join命令连接这些文件以获取此输出:

1 aa
2 b
3 c
4 d
5 e
6 ff
7 g 
8 h

Dogbanes的回答有效但...... 当我在这个文件上应用dogbanes回答:

27  27
28  22
29  37
30  15
31  21
32  13
33  18
34  24

和此:

27  7
28  13
29  6
30  12
31  30
32  5
33  10
34  28

他们没有加入:

27  27
27  7
28  13
28  22
29  37
29  6
30  12
30  15
31  21
31  30
32  13
32  5
33  10
33  18
34  24
34  28

第二种情况是制表符分隔,因此我使用了-t \t

3 个答案:

答案 0 :(得分:12)

首先sort这两个文件。然后使用join加入两个文件的第一个字段。如果要删除空格并将sed转换为a a,还需要通过aa管道输出。如下所示:

$ join -t " " -1 1 -2 1 -a 1 -a 2  <(sort file1) <(sort file2) | sed 's/ \([a-z]\) / \1/g'
1 aa
2 b
3 c
4 d
5 e
6 ff
7 g
8 h

答案 1 :(得分:12)

适合我(差不多)。您应该为标签字符指定-t $'\t',而不只是-t \t。除非在\t引号中,否则Bash不会解释$''

join -t $'\t' -o 1.2,2.2 <(echo  $'27\t27
28\t22
29\t37
30\t15
31\t21
32\t13
33\t18
34\t24' | sort) <(echo $'27\t7
28\t13
29\t6
30\t12
31\t30
32\t5
33\t10
34\t28' | sort)
27      7
22      13
37      6
15      12
21      30
13      5
18      10
24      28

答案 2 :(得分:4)

这适用于您的两种情况:

awk 'NR==FNR{a[$1]=$2;next;} {a[$1]=($1 in a)?a[$1]$2:$2}END{for(x in a)print x,a[x]}' f1 f2|sort

案例一的输出:

1 aa
2 b
3 c
4 d
5 e
6 ff
7 g
8 h

案例二的输出:

27 277
28 2213
29 376
30 1512
31 2130
32 135
33 1810
34 2428