2012-01-13 218 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