2012-01-13 163 views
8

Infile1:猛砸join命令

1 a 
3 c 
4 d 
6 f 

Infile2:

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

如何加入与UNIX中,这些文件加入命令得到这个输出:

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

回答

11

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

$ 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 
11

适用于我(差不多)。您应该为制表符指定-t $'\t',而不仅仅是-t \t。 Bash不解释\t,除非在$''报价。

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 
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 
+0

干得漂亮。喜欢使用'三元运算符'而不是'if-else' +1 :) – 2012-01-13 17:24:20