ลบบรรทัดหากบรรทัดถัดไปเหมือนกัน


15

ฉันสามารถใช้คำสั่ง sed / awk อะไรได้บ้าง เพียงแค่sort -uจะลบอินสแตนซ์ทั้งหมด

การป้อนข้อมูล:

abc
abc
def
abc
abc
def

ผลลัพธ์ที่คาดหวัง:

abc
def
abc
def

คำตอบ:


36

นั่นคือสิ่งที่uniqคำสั่งมาตรฐานสำหรับ

uniq your-file

โปรดทราบว่าuniqการใช้งานบางอย่างเช่น GNU uniqจะให้ลำดับบรรทัดแรกที่เรียงลำดับเดียวกัน (โดยที่strcoll()คืน 0) ซึ่งตรงข้ามกับbyte-to-byte เหมือนกัน (โดยที่memcmp()หรือstrcmp()คืน 0) หากต้องการบังคับให้เปรียบเทียบไบต์กับไบต์โดยไม่คำนึงถึงการuniqใช้งานคุณสามารถบังคับโลแคลCด้วย:

LC_ALL=C uniq your-file

7

เสียงเรียกเข้าสามารถทำได้อย่างนี้:

:g/\v^(.*\n)\1/d

หรือหากคุณต้องการใช้เสียงเรียกเข้าเป็นเครื่องมือบรรทัดคำสั่งคุณสามารถทำเช่นนี้ได้

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

วิธีนี้คุณไม่ต้องต่อสู้กับการออกเป็นกลุ่มในภายหลัง;)

คำอธิบาย:

:g/

ในทุกบรรทัดที่ตรงกับ regex นี้ ...

\v^(.*\n)\1

บรรทัดใด ๆ ตามด้วยตัวเอง ...

/d

เรียกใช้คำสั่งd elete (ลบบรรทัดปัจจุบัน) -c "wq"คือการบันทึกการเปลี่ยนแปลงและทางออก


โปรดทราบว่าด้วย vim 8.1.2112 เป็นอย่างน้อยจะไม่สามารถทำงานกับบรรทัดที่ซ้ำกันซึ่งเป็นสองบรรทัดสุดท้ายของไฟล์ นอกจากนี้มันจะลบหนึ่งรายการซ้ำจากลำดับของ 3 บรรทัดที่ซ้ำกัน
Stéphane Chazelas

1
@ StéphaneChazelasยกเว้นว่าขณะนี้เราไม่มีข้อมูลจำเพาะสำหรับพฤติกรรมที่ต้องการในกรณีที่ 3 บรรทัด - ฉันสามารถดูพฤติกรรมที่ต้องการได้ทั้งสองวิธี
D. Ben Knoble
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.