ลบบรรทัดตามรายการที่ซ้ำกันภายในหนึ่งคอลัมน์โดยไม่มีการเรียงลำดับ


30

ฉันมีไฟล์ 3 คอลัมน์ขนาดใหญ่ (~ 10,000 บรรทัด) และฉันต้องการลบบรรทัดเมื่อเนื้อหาของคอลัมน์ที่สามของบรรทัดนั้นปรากฏในคอลัมน์ที่สามของอีกบรรทัดหนึ่ง ขนาดของไฟล์นั้นค่อนข้างยุ่งยากและฉันไม่สามารถใช้บางอย่างเช่นโค้ดด้านล่างได้เพราะทั้งบรรทัดนั้นไม่เหมือนกัน แค่เนื้อหาของคอลัมน์ 3

awk '!seen[$0]++' filename

คำตอบ:


31

เพียงเปลี่ยนคำสั่ง awk ของคุณเป็นคอลัมน์ที่คุณต้องการดำเนินการเพื่อลบบรรทัดที่ซ้ำกันตาม (ในคอลัมน์กรณีที่สามของคุณ):

awk '!seen[$3]++' filename

คำสั่งนี้บอกawkบรรทัดที่จะพิมพ์ ตัวแปร$3เก็บเนื้อหาทั้งหมดของคอลัมน์ 3 และวงเล็บเหลี่ยมคือการเข้าถึงอาร์เรย์ ดังนั้นสำหรับแต่ละคอลัมน์ที่สามของบรรทัดในชื่อไฟล์โหนดของอาร์เรย์ที่มีชื่อseenจะเพิ่มขึ้นและบรรทัดที่พิมพ์หากเนื้อหาของโหนดนั้น (คอลัมน์ 3) ไม่ได้ ( !) ตั้งก่อนหน้านี้

เหนือawkคำสั่งจะทำงานถ้าคอลัมน์ของคุณในแฟ้มใส่จะถูกคั่นด้วยspaceหรือTabระหว่างตัวเองถ้าคอลัมน์คั่นด้วยกับสิ่งอื่นคุณจะต้องบอกให้ awk กับ-Fตัวเลือก ตัวอย่างเช่นถ้าคอลัมน์ทั้งหมดคั่นด้วยเครื่องหมายจุลภาค ( ,) และต้องการลบเส้นฐานในคอลัมน์ที่สามใช้-F','ตัวเลือก

awk -F',' '!seen[$3]++' filename

18

sortคำสั่งถูกปรับให้เหมาะสมแล้วเพื่อจัดการไฟล์ขนาดใหญ่ ดังนั้นคุณสามารถใช้sortคำสั่งในไฟล์ของคุณได้เป็นอย่างดี

sort -u -t' ' -k3,3 file
  • -u - พิมพ์เฉพาะบรรทัดที่ไม่ซ้ำกัน
  • -t- ระบุตัวคั่น ในตัวอย่างนี้ฉันใช้พื้นที่เป็นตัวคั่น
  • -k3,3 - เรียงลำดับในฟิลด์ที่ 3

คุณสามารถอ้างถึงคำตอบนี้ซึ่งแสดงให้เห็นว่าการจัดเรียง GNU ในความเป็นจริงเป็นวิธีที่ดีกว่าสำหรับการจัดเรียงไฟล์ขนาดใหญ่ ในกรณีของคุณฉันคิดว่าไม่มี-parallelคุณสามารถบรรลุผลสุดท้ายโดยไม่ล่าช้ามาก


เป็นเรื่องเกี่ยวกับที่จะแสดงความคิดเห็นอย่างบ้าคลั่งที่-uจะลบบรรทัดที่ซ้ำกันเท่านั้นไม่ใช่คีย์ที่ซ้ำกัน... แต่ฉันผิด
Randoms

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