ใช้รายการคำเพื่อ grep ในรายการอื่น


8

ฉันมีรายการที่มี 250 บรรทัดอยู่ในนั้น ฉันต้องเรียกใช้พวกเขาทั้งหมดผ่านเว็บเซิร์ฟเวอร์เพื่อรับรายการผลลัพธ์ อย่างไรก็ตามรายการนี้ส่งคืนบรรทัดมากกว่าที่ฉันสนใจบอกฉันlist.txtว่า:

a.1
b.1
etc

ดังนั้นผลลัพธ์คือoutput.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

เป็นไปได้ไหมที่จะใช้คำสั่ง grep เพื่อค้นหาคำทั้งหมดใน list.txt ใน output.txt จากนั้นสร้างรายการ "ที่ต้องการ" want.txt ฉันต้องการทั้งบรรทัดใน output.txt ของฉันฉันใหม่ในการเขียนสคริปต์ แต่สิ่งที่ฉันต้องการคือบางสิ่งบางอย่างเช่น

grep list.txt output.txt > wanted.txt

ฉันไม่พบตัวอย่างของสิ่งนี้


พวกเขาทั้งสองตามลำดับตัวอักษรเหมือนตัวอย่างของคุณหรือไม่
Oli

ไม่ฉันมีลำดับที่ไม่ใช่ตัวอักษรเฉพาะใน list.txt ของฉัน แต่ output.txt นั้นเรียงตามตัวอักษร แต่ฉันต้องการให้มีเฉพาะ "Hit" สำหรับ list.txt ของฉันตามลำดับที่ไม่ใช่ตัวอักษรเดียวกัน
Ditte

คำตอบ:


11

ฉันจะไม่สนใจgrepสิ่งนี้ เป็นเรื่องที่ดีสำหรับการแสดงออกปกติ แต่ดูเหมือนคุณจะไม่ต้องการที่นี่จริงๆ commสามารถเปรียบเทียบสองไฟล์และแสดงจุดแยก ใช้ตัวอย่างที่แน่นอนของคุณ:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

สิ่งนี้เร็วกว่า grep แต่จะต้องอาศัย (อย่างมาก) กับไฟล์ที่เรียงลำดับ หากไม่ใช่คุณสามารถเรียงลำดับล่วงหน้าได้ แต่จะเปลี่ยนผลลัพธ์ดังนั้นจึงจัดเรียงได้

comm -12 <(sort list.txt) <(sort output.txt) 

อีกทางเลือกหนึ่งคำตอบจากiiSeymourจะช่วยให้คุณทำเช่นนั้นgrepได้ แฟล็กขอไฟล์อินพุตและบังคับให้ค้นหาสตริงเต็มคำ สิ่งนี้จะไม่พึ่งพาการสั่งซื้อ แต่จะขึ้นอยู่กับการoutput.txtสั่งซื้อ ย้อนกลับไฟล์หากคุณต้องการตามลำดับของ list.txt

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

หากคุณlist.txtมีขนาดใหญ่จริง ๆคุณอาจต้องจัดการมันซ้ำไปซ้ำมาเล็กน้อยและส่งแต่ละบรรทัดไปยัง grep แยกกัน ซึ่งจะเพิ่มเวลาการประมวลผลอย่างหนาแน่น ในด้านบนคุณจะต้องอ่านoutput.txtเพียงครั้งเดียว แต่วิธีนี้คุณจะอ่านและประมวลผลทุกบรรทัด list.txt มันน่ากลัว ... แต่มันอาจเป็นทางเลือกเดียวของคุณ ในทางกลับกันมันจะเรียงลำดับสิ่งต่าง ๆ ตามlist.txtลำดับ

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc

1
มันฉลาดจริงๆ! เหตุผลสำหรับ -12 คืออะไร?
Ditte

3
-1ไม่แสดงบรรทัดที่ไม่ซ้ำกับไฟล์แรก-2ระงับบรรทัดที่ไม่ซ้ำกับไฟล์ที่สองและ-3ไม่แสดงบรรทัดที่เหมือนกันทั้งคู่ เพื่อให้ได้สายทั่วไปเราจะปราบปรามสิ่งที่ไม่-12เหมือนใคร
Oli

ดี! ฉันคิดว่าฉันจะใช้คำสั่ง comm และเมื่อฉันต้องการเรียงลำดับ output.txt ให้มีคำสั่งเหมือนกับ list.txt ฉันจะใช้ comm -12 <(sort list.txt) <(เรียงลำดับ output.txt) ในภายหลังหรือไม่
Ditte

คำสั่ง comm ไม่ได้ให้ทั้งบรรทัดใน result.txt (และฉันต้องการทั้งหมดเพื่อรับข้อมูลจากที่นั่น) แต่ถ้าฉันลองใช้คำสั่ง grep มันจะทำให้ฉันเป็น grep: หน่วยความจำไม่เพียงพอ หมายความว่ามันใหญ่เกินไปใช่ไหม
Ditte

ตัวอย่างที่ 2 มี STDIN ที่ซ้ำซ้อนเปลี่ยนเส้นทางเชลล์จะตั้งค่าสถานะเป็นข้อผิดพลาด อย่างใดอย่างหนึ่งทำให้ไฟล์ temp หรือใช้ FD พิเศษกับพื้นหลังเรียงลำดับไปป์ไลน์กับมัน (หากินในเปลือกหอยส่วนใหญ่) ... นี่เป็นมากกว่าการเขียนโปรแกรมที่ดีกว่าคำถามที่ถามในกองมากเกิน ส่วนตัวฉันจะทำสิ่งนี้ในหลาม
Skaperen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.