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
干 猕猴桃
sumber

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
Stéphane Chazelas
sumber
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.

James
sumber
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