ฉันใช้ 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 ...