Hapus baris jika baris berikutnya sama


15

Apa perintah sed / awk yang bisa saya gunakan? Hanya sort -uakan menghapus semua instance

Memasukkan:

abc
abc
def
abc
abc
def

Output yang diharapkan:

abc
def
abc
def

Jawaban:


36

Untuk itulah uniqperintah standar.

uniq your-file

Perhatikan bahwa beberapa uniqimplementasi seperti GNU uniqakan memberi Anda yang pertama dari urutan baris yang mengurutkan yang sama (di mana strcoll()mengembalikan 0) sebagai lawan adalah byte-to-byte identik (di mana memcmp()atau strcmp()mengembalikan 0). Untuk memaksa perbandingan byte ke byte terlepas dari uniqimplementasinya, Anda dapat memaksa lokal Cmenggunakan:

LC_ALL=C uniq your-file

7

Vim dapat mencapai ini dengan baik:

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

Atau jika Anda lebih suka menggunakan vim sebagai alat baris perintah, Anda bisa melakukan ini sebagai

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

Dengan cara ini Anda tidak harus bergulat dengan keluar dari vim nanti;)

Penjelasan:

:g/

Di semua lini yang cocok dengan regex ini ...

\v^(.*\n)\1

Setiap baris diikuti dengan sendirinya ...

/d

jalankan perintah d elete (hapus baris saat ini). The -c "wq"adalah untuk menyimpan perubahan dan keluar.


Perhatikan bahwa dengan vim 8.1.2112 setidaknya, itu tidak berfungsi untuk baris duplikat yang merupakan dua baris terakhir file. Selain itu, hanya menghapus satu duplikat dari urutan 3 baris duplikat.
Stéphane Chazelas

1
@ StéphaneChazelas, kecuali bahwa saat ini kami tidak memiliki spesifikasi untuk perilaku yang diinginkan dalam case 3-line — saya dapat melihat perilaku yang diinginkan dengan dua cara.
D. Ben Knoble
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.