ฉันรู้ว่าคุณพูดawk
แต่มีjoin
คำสั่งสำหรับวัตถุประสงค์นี้ ...
{
join -o 1.1,2.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
join -v 1 -o 1.1,1.2 -1 2 -2 1 <(sort -k 2 File1.txt) <(sort -k 1 File2.txt)
} | sort -k 1
มันจะเพียงพอกับjoin
คำสั่งแรกถ้ามันไม่ได้สำหรับบรรทัดนี้:
item4 platD
คำสั่งโดยทั่วไปบอกว่า: เข้าร่วมตามคอลัมน์ที่สองของไฟล์แรก ( -1 2
) และคอลัมน์แรกของไฟล์ที่สอง ( -2 1
) และส่งออกคอลัมน์แรกของไฟล์แรกและคอลัมน์ที่สองของไฟล์ที่สอง ( -o 1.1,2.2
) นั่นแสดงให้เห็นเพียงเส้นที่จับคู่ คำสั่ง join ที่สองบอกว่าเกือบเหมือนกัน แต่มันบอกให้แสดงบรรทัดจากไฟล์แรกที่ไม่สามารถจับคู่ ( -v 1
) และส่งออกคอลัมน์แรกของไฟล์แรกและคอลัมน์ที่สองของไฟล์แรก ( -o 1.1,1.2
) จากนั้นเราเรียงลำดับผลลัพธ์ของทั้งสองรวมกัน sort -k 1
หมายถึงการเรียงลำดับตามคอลัมน์แรกและsort -k 2
หมายถึงการเรียงลำดับตามคอลัมน์ที่สอง join
สิ่งสำคัญคือการจัดเรียงไฟล์ตามคอลัมน์เข้าร่วมก่อนที่จะผ่านพวกเขาไป
ตอนนี้ฉันเขียนการเรียงลำดับสองครั้งเพราะฉันไม่ชอบทิ้งไฟล์ไดเรกทอรีด้วยไฟล์ถ้าฉันสามารถช่วยได้ อย่างไรก็ตามเช่นเดียวกับ David Foerster กล่าวขึ้นอยู่กับขนาดของไฟล์คุณอาจต้องการเรียงลำดับไฟล์และบันทึกก่อนเพื่อไม่ต้องรอเรียงลำดับสองครั้ง เพื่อให้เข้าใจถึงขนาดนี่คือเวลาที่ใช้ในการเรียงลำดับ 1 ล้านและ 10 ล้านบรรทัดบนคอมพิวเตอร์ของฉัน:
$ ruby -e '(1..1000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 1million.txt
$ ruby -e '(1..10000000).each {|i| puts "item#{i} plat#{i}"}' | shuf > 10million.txt
$ head 10million.txt
item530284 plat530284
item7946579 plat7946579
item1521735 plat1521735
item9762844 plat9762844
item2289811 plat2289811
item6878181 plat6878181
item7957075 plat7957075
item2527811 plat2527811
item5940907 plat5940907
item3289494 plat3289494
$ TIMEFORMAT=%E
$ time sort 1million.txt >/dev/null
1.547
$ time sort 10million.txt >/dev/null
19.187
นั่นคือ 1.5 วินาทีสำหรับ 1 ล้านบรรทัดและ 19 วินาทีสำหรับ 10 ล้านบรรทัด