tôi đã tự hỏi đó trong những giải pháp sau đây là "nhanh nhất" cho "lớn hơn" tập tin:
awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file1 file2 # awk1 by SiegeX
awk 'FNR==NR{a[$0]++;next}!($0 in a)' file1 file2 # awk2 by ghostdog74
comm -13 <(sort file1) <(sort file2)
join -v 2 <(sort file1) <(sort file2)
grep -v -F -x -f file1 file2
Kết quả điểm chuẩn của tôi trong ngắn hạn:
- Không sử dụng
grep -Fxf
, chậm hơn nhiều (2-4 lần trong các thử nghiệm của tôi).
comm
hơi nhanh hơn join
.
- Nếu tệp1 và tệp2 đã được sắp xếp,
comm
và join
nhanh hơn awk1 + awk2 nhanh hơn nhiều. (Tất nhiên, chúng không giả định các tệp đã sắp xếp.)
- awk1 + awk2, được cho là, sử dụng nhiều RAM hơn và ít CPU hơn. Thời gian chạy thực tế thấp hơn cho
comm
có thể do thực tế là nó sử dụng nhiều chủ đề hơn. Thời gian CPU thấp hơn cho awk1 + awk2.
Vì lợi ích ngắn gọn, tôi bỏ qua chi tiết đầy đủ. Tuy nhiên, tôi cho rằng bất cứ ai quan tâm có thể liên hệ với tôi hoặc chỉ cần lặp lại các bài kiểm tra. Xấp xỉ, thiết lập là
# Debian Squeeze, Bash 4.1.5, LC_ALL=C, slow 4 core CPU
$ wc file1 file2
321599 321599 8098710 file1
321603 321603 8098794 file2
kết quả tiêu biểu của chạy nhanh nhất
awk2: real 0m1.145s user 0m1.088s sys 0m0.056s user+sys 1.144
awk1: real 0m1.369s user 0m1.324s sys 0m0.044s user+sys 1.368
comm: real 0m0.980s user 0m1.608s sys 0m0.184s user+sys 1.792
join: real 0m1.080s user 0m1.756s sys 0m0.140s user+sys 1.896
grep: real 0m4.005s user 0m3.844s sys 0m0.160s user+sys 4.004
BTW, cho awkies: Dường như a[$0]=1
nhanh hơn a[$0]++
, và (!($0 in a))
nhanh hơn (!a[$0])
. Vì vậy, đối với một giải pháp awk Tôi đề nghị:
awk 'FNR==NR{a[$0]=1;next}!($0 in a)' file1 file2
Bài tập về nhà phải không? Nếu tích cực, vui lòng gắn thẻ như vậy. – karlphillip
dấu phân tách giá trị là gì? – Ass3mbler
bắt tốt! mỗi giá trị nằm trên một dòng riêng; vì vậy dòng mới là sep. – mark