2012-01-13 30 views
8

Infile1:Bash tham gia lệnh

1 a 
3 c 
4 d 
6 f 

Infile2:

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

Làm thế nào để tham gia những tập tin này với unix tham gia lệnh để có được kết quả này:

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

Dogbanes trả lời làm việc nhưng ... khi tôi áp dụng dogbanes câu trả lời trong tệp này:

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

và điều này:

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

Họ không tham gia:

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 

Kịch bản thứ hai là phân định tab vì vậy tôi sử dụng -t \t

Trả lời

11

Đầu tiên sort cả tập tin. Sau đó sử dụng join để tham gia vào trường đầu tiên của cả hai tệp. Bạn cũng cần phải đầu ra đường ống thông qua sed nếu bạn muốn loại bỏ không gian và do đó chuyển đổi a a thành aa. Điều này được hiển thị bên dưới:

$ 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

Làm việc cho tôi (hầu hết). Bạn nên chỉ định -t $'\t' cho ký tự tab, không chỉ -t \t. Bash không giải thích \t trừ khi trong $'' dấu ngoặc kép.

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

này nên làm việc cho cả hai trường hợp của bạn:

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 

đầu ra đối với trường hợp một:

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

đầu ra cho trường hợp hai:

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

phút về trước. Đã thích sử dụng toán tử 'ternary' thay vì' if-else' +1 :) –