จัดเรียงและผสาน 2 ไฟล์โดยไม่มีบรรทัดที่ซ้ำกันโดยยึดตามคอลัมน์แรก


12

ฉันมีไฟล์ที่มีชื่อการทดสอบทั้งหมด:

$ cat all_tests.txt
test1
test2
test3
test4
test5
test6

และอีกไฟล์หนึ่งที่มีชื่อการทดสอบและผลลัพธ์ที่เกี่ยวข้อง:

$ cat completed_tests.txt
test1 Passed
test3 Failed
test5 Passed
test6 Passed

วิธีการสร้างไฟล์ใหม่ที่มีชื่อการทดสอบทั้งหมดที่มีผลลัพธ์ที่เกี่ยวข้องโดยไม่ซ้ำกัน?

หากฉันดำเนินการ:

sort all_tests.txt completed_tests.txt

ผลลัพธ์ประกอบด้วยรายการที่ซ้ำกัน:

test1 
test1 Passed
test2
test3 
test3 Failed
test4
test5 
test5 Passed
test6 
test6 Passed

ผลลัพธ์ที่ต้องการ:

test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

คำตอบ:


17

ดูเหมือนว่าคุณสามารถทำสิ่งนี้joinได้อย่างง่ายดายหากไฟล์ถูกเรียงลำดับทั้งคู่

$ join -a 1 all_test.txt completed_test.txt
test1 Passed
test2
test3 Failed
test4
test5 Passed
test6 Passed

-a 1 หมายถึงพิมพ์บรรทัดจากไฟล์ 1 ที่ไม่ได้เข้าร่วม

หากไฟล์ของคุณยังไม่ได้เรียงคุณสามารถใช้สิ่งนี้ (ขอบคุณ terdon!):

join -a 1  <(sort all_tests.txt) <(sort completed_tests.txt )

7

เครื่องมือที่เหมาะสมในที่นี่จะjoinเป็นปัญหาโดย @Zanna แต่ที่นี่เป็นawkวิธีการ:

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,a[$1]}' completed_tests.txt all_tests.txt 
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

2

Perl

นี่เป็นคำตอบของ terdon:

$ perl -lane '$t+=1; $h{$F[0]}=$F[1] if $.==$t; print $F[0]," ",$h{$F[0]} if $t!=$.;$.=0 if eof' completed_tests.txt all_tests.txt          
test1 Passed
test2 
test3 Failed
test4 
test5 Passed
test6 Passed

สิ่งนี้ทำงานโดยการสร้างแฮชของคู่ของสถานะการทดสอบจากcompleted_test.txtนั้นค้นหาบรรทัดในall_tests.txtแฮชนั้น $tตัวแปรของเส้นรวมแปรรูปจากแต่ละไฟล์และ$.ที่จะถูกรีเซ็ตเมื่อมาถึงจุดสิ้นสุดของแฟ้มช่วยให้เราสามารถติดตามแฟ้มปัจจุบันคือการอ่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.