2012-01-13 11 views
8

Infile1参加:bashはコマンド

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が働い答えますしかし... ドッグベーンをこのファイルに適用すると

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 

2つ目のシナリオは、私が

答えて

11

まずsort両方のファイル-t \tを使用ので、タブ区切りです。次に、joinを使用して、両方のファイルの最初のフィールドに参加します。また、スペースを削除する場合はsedに出力をパイプする必要があり、a aaaに変換する必要があります。これは次のとおりです。

$ 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に対する出力:ケース2について

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'の代わりに' ternary operator'を使うのが好きです+1 :) –

関連する問題