Saya memiliki file teks yang berisi daftar panjang entri (satu di setiap baris). Beberapa di antaranya adalah duplikat, dan saya ingin tahu apakah mungkin (dan jika demikian, bagaimana) menghapus duplikat apa pun. Saya tertarik melakukan ini dari dalam vi / vim, jika memungkinkan.
vim
duplicates
Sydius
sumber
sumber
Jawaban:
Jika Anda setuju dengan penyortiran file Anda, Anda dapat menggunakan:
sumber
:%!uniq
untuk menghapus entri duplikat tanpa mengurutkan file.u
Coba ini:
Ini mencari baris apa pun segera diikuti oleh satu atau lebih salinan dari dirinya sendiri, dan menggantinya dengan satu salinan.
Buat salinan file Anda sebelum Anda mencobanya. Ini belum teruji.
sumber
Dari baris perintah lakukan saja:
sumber
:sort u
tergantung di file besar saya. Ini bekerja dengan sangat cepat dan sempurna. Terima kasih!'uniq' is not recognized as an internal or external command, operable program or batch file.
awk '!x[$0]++' yourfile.txt
jika Anda ingin mempertahankan urutan (yaitu, penyortiran tidak dapat diterima). Untuk memanggilnya dari vim,:!
bisa digunakan.sumber
Bekerja untuk saya di Windows. Garis harus diurutkan terlebih dahulu.
sumber
aaaa
diikuti olehaaaabb
akan menghapus secaraaaaa
keliru.Saya akan menggabungkan dua jawaban di atas:
Jika Anda tertarik untuk melihat berapa banyak baris duplikat yang dihapus, gunakan control-G sebelum dan sesudah untuk memeriksa jumlah baris yang ada di buffer Anda.
sumber
'uniq' is not recognized as an internal or external command, operable program or batch file.
Pilih garis dalam mode garis visual ( Shift+ v), lalu
:!uniq
. Itu hanya akan menangkap duplikat yang datang satu demi satu.sumber
Mengenai bagaimana Uniq dapat diimplementasikan di VimL, cari Uniq di plugin yang saya kelola . Anda akan melihat berbagai cara untuk menerapkannya yang diberikan di milis Vim.
Jika tidak,
:sort u
memang cara untuk pergi.sumber
atau
ini jawaban saya untuk Anda, ini dapat menghapus beberapa baris duplikat dan hanya menyimpan satu tidak menghapus!
sumber
Saya akan menggunakan
!}uniq
, tetapi itu hanya berfungsi jika tidak ada baris kosong.Untuk setiap baris dalam sebuah file digunakan:
:1,$!uniq
.sumber
Versi ini hanya menghapus garis berulang yang bersinggungan. Maksud saya, hanya menghapus baris berulang yang berurutan. Menggunakan peta yang diberikan, fungsinya tidak mengacaukan garis kosong. Tetapi jika mengubah REGEX agar sesuai dengan awal baris
^
itu juga akan menghapus duplikat baris kosong.sumber
Metode alternatif yang tidak menggunakan vi / vim (untuk file yang sangat besar), adalah dari baris perintah Linux gunakan sort dan uniq:
sumber
Ini berhasil bagi saya untuk keduanya
.csv
dan.txt
awk '!seen[$0]++' <filename> > <newFileName>
Penjelasan: Bagian pertama dari perintah mencetak baris unik dan bagian kedua yaitu setelah panah tengah adalah untuk menyimpan keluaran dari bagian pertama.
awk '!seen[$0]++' <filename>
>
<newFileName>
sumber