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
答案 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