2012-05-14 26 views
5

tôi có hai tập tin, aa và bb:join bỏ qua dòng đầu ra khi đầu vào sắp xếp số lượng

$ cat aa 
84 xxx 
85 xxx 
10101 sdf 
10301 23 

$ cat bb 
82 asd 
83 asf 
84 asdfasdf 
10101 22232 
10301 llll 

tôi sử dụng lệnh tham gia tham gia cùng họ:

$ join aa bb 
84 xxx asdfasdf 

nhưng những gì mong đợi là 84, 10101 và 10301 tất cả đã tham gia. Tại sao chỉ 84 người tham gia?

+0

@qiuxafei đã chỉnh sửa gắn thẻ của câu hỏi - tham gia không phải là một phần của bash, mà là một công cụ UNIX chuẩn có thể truy cập từ bất kỳ trình bao nào. –

Trả lời

8

Sử dụng sắp xếp từ điển thay vì loại số.

Để làm điều này như là một phần của quá trình:

$ join <(sort aa) <(sort bb) 

này cho kết quả:

10101 sdf 22232 
10301 23 llll 
84 xxx asdfasdf 
+2

Không tham gia hỗ trợ thứ tự số? – qiuxiafei

+1

@qiuxiafei không, tham gia không hỗ trợ thứ tự số. –

6

Bạn không bao gồm thực tế là một thông báo lỗi là đầu ra:

$ join aa bb 
join: file 2 is not in sorted order 
84 xxx asdfasdf 
join: file 1 is not in sorted order 

Bạn có thể sử dụng loại từ điển thông thường:

join <(sort aa) <(sort bb) | sort -k1,1n 
+2

không phải tất cả các triển khai đều đưa ra lỗi này - một số chỉ thất bại âm thầm. –

3

Nếu bạn muốn tránh phân loại, sau đó bạn có thể không pad với awk:

join \ 
<(awk '{printf("%05d %s\n", $1, $2)}' aa) \ 
<(awk '{printf("%05d %s\n", $1, $2)}' bb) \ 
| awk '{print int($1),$2,$3}' 

Tạo đầu ra này mà bảo toàn thứ tự sắp xếp ban đầu:

84 xxx asdfasdf 
10101 sdf 22232 
10301 23 llll 

Bạn muốn tránh sắp xếp, vì Unix sắp xếp là O (n log n).

Các vấn đề liên quan