ฉันใช้ grep awk sort ในเชลล์ unix จำนวนมากเพื่อทำงานกับไฟล์ข้อความคอลัมน์แบบแยกแท็บขนาดกลาง (ประมาณ 10M-100M) ในแง่นี้ยูนิกซ์เชลล์คือสเปรดชีตของฉัน
แต่ฉันมีปัญหาใหญ่หนึ่งอย่างนั่นคือการเลือกระเบียนที่ระบุรายการรหัส
มีtable.csv
ไฟล์ที่มีรูปแบบid\tfoo\tbar...
และids.csv
ไฟล์ที่มีรายชื่อของรหัสเพียงเลือกระเบียนจากtable.csv
ที่มี ID ids.csv
อยู่ใน
ชนิดของ/programming/13732295/extract-all-lines-from-text-file-based-on-a-given-list-of-idsแต่มีเชลล์ไม่ใช่ perl
grep -F
เห็นได้ชัดว่าสร้างผลบวกที่ผิดพลาดถ้ารหัสเป็นความกว้างของตัวแปร
join
เป็นเครื่องมือที่ฉันไม่สามารถหาได้ ก่อนอื่นก็ต้องเรียงลำดับตัวอักษร (ไฟล์ของฉันมักจะเรียงลำดับตัวเลข) แต่ถึงอย่างนั้นฉันก็ไม่สามารถทำงานได้โดยไม่บ่นเกี่ยวกับลำดับที่ไม่ถูกต้องและข้ามบางระเบียน ดังนั้นฉันไม่ชอบมัน grep -f เทียบกับไฟล์ที่มี^id\t
-s ช้ามากเมื่อจำนวนรหัสมีขนาดใหญ่
awk
ยุ่งยาก
มีวิธีแก้ปัญหาที่ดีสำหรับเรื่องนี้หรือไม่? มีเครื่องมือเฉพาะสำหรับไฟล์ที่คั่นด้วยแท็บหรือไม่ ฟังก์ชั่นพิเศษจะได้รับการต้อนรับมากที่สุดเช่นกัน
UPD: แก้ไขแล้วsort
->join
awk
อีกทางเลือกหนึ่งที่ควรจะเป็นไปได้ที่จะเขียนสคริปต์ที่คล้ายกันใน
sort
สามารถทำการเรียงลำดับตัวเลขตัวอักษรและอื่น ๆ ทุกชนิด man sort
ดู
grep -f
ช้าเกินไปการคงไว้ซึ่งกลยุทธ์นี้ดูเหมือนจะเป็นปัญหามากกว่าที่ควรจะเป็น - การแปรผันจะตกอยู่ในปัญหาประสิทธิภาพ O (N * M) เดียวกัน บางทีเวลาของคุณจะใช้ดีกว่าการเรียนรู้วิธีการใช้ปกติ SQL DB ...