Saya menemukan sed
jawabannya tidak lama setelah saya memposting pertanyaan ini; tidak ada orang lain yang telah menggunakan sed
sejauh ini jadi ini dia:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
Sedikit bermain-main dengan masalah yang lebih umum (bagaimana dengan menghapus garis di set tiga? Atau empat, atau lima?) Memberikan solusi yang dapat diperluas berikut:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
Diperpanjang untuk menghapus tiga kali lipat garis:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
Atau untuk menghapus quads of lines:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
memiliki keunggulan tambahan dibandingkan sebagian besar opsi lain, yaitu kemampuannya untuk benar-benar beroperasi dalam aliran, tanpa penyimpanan memori yang lebih dibutuhkan daripada jumlah baris aktual yang akan diperiksa untuk duplikat.
Seperti ditunjukkan cuonglm dalam komentar , pengaturan lokal ke C diperlukan untuk menghindari kegagalan untuk menghapus baris yang berisi karakter multi-byte dengan benar. Jadi perintah di atas menjadi:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
, jika tidak dalam multi-byte lokal, karakter yang tidak valid di lokal itu menyebabkan perintah gagal.Itu tidak terlalu elegan, tapi sesederhana yang saya dapat dengan:
Substr () hanya memotong
uniq
output. Itu akan bekerja sampai Anda memiliki lebih dari 9.999.999 duplikat dari sebuah baris (dalam hal ini keluaran uniq dapat meluas lebih dari 9 karakter).sumber
uniq -c input | awk '{if ($1 %2 == 1) { print $2 } }'
dan tampaknya berfungsi sama baiknya. Ada alasan mengapasubstr
versinya lebih baik?$2
untuk$NF
menjadi lebih kuat?foo bar
,.uniq
(setidaknya dalam GNU coreutils) tampaknya andal menggunakan tepat 9 karakter sebelum teks itu sendiri; Saya tidak dapat menemukan ini didokumentasikan di mana pun, dan itu tidak ada dalam spesifikasi POSIX .Cobalah
awk
skrip ini di bawah ini:Diasumsikan bahwa
lines.txt
file tersebut diurutkan.Ujian:
sumber
Dengan
pcregrep
untuk sampel yang diberikan:atau dengan cara yang lebih umum:
sumber
Jika input diurutkan:
sumber
pineapple\napple\ncoconut
dan hasilnya adalahpinecoconut
.\n
alih-alih$
memberikan/m
pengubah, tetapi kemudian saya menyadari bahwa menggunakan$
akan meninggalkan baris kosong di tempat baris yang dihapus. Terlihat bagus sekarang; Saya telah menghapus versi yang salah karena baru saja menambahkan noise. :)Saya suka
python
untuk ini, misalnya denganpython
2.7+sumber
Ketika saya memahami pertanyaan yang saya pilih untuk awk, menggunakan hash dari setiap record, dalam hal ini saya berasumsi bahwa RS = \ n, tetapi dapat diubah untuk mempertimbangkan segala jenis pengaturan lainnya, dapat diatur untuk mempertimbangkan suatu genap jumlah repetisi, bukan yang ganjil, dengan parameter atau dialog kecil. Setiap baris digunakan sebagai hash dan jumlahnya meningkat, pada akhir file array dipindai dan mencetak setiap hitungan genap dari catatan. Saya menyertakan hitungan untuk memeriksa tetapi, menghapus [x] sudah cukup untuk menyelesaikan masalah itu.
HTH
kode hitungan mundur
Contoh data:
Contoh Run:
sumber
awk
kode yang bagus, tetapi sayangnyaawk
array asosiatif tidak dipesan sama sekali, dan juga tidak menjaga pesanan.sort
.!=0
ini tersirat oleh bagaimanaawk
mengkonversi angka ke nilai benar / salah, membuat ini dapat direduksi menjadiawk '{a[$0]++}END{for(x in a)if(a[x]%2)print x}'
Jika input diurutkan, bagaimana dengan ini
awk
:sumber
dengan perl:
sumber
Menggunakan konstruksi shell,
sumber
$b
).Teka-teki yang menyenangkan!
Dalam Perl:
Secara verbal di Haskell:
Tersely di Haskell:
sumber
versi: Saya menggunakan "pembatas" untuk menyederhanakan loop dalam (ia menganggap baris pertama tidak
__unlikely_beginning__
dan mengasumsikan teks tidak berakhir dengan baris__unlikely_ending__
:, dan menambahkan garis pembatas khusus di akhir baris yang dimasukkan. Dengan demikian, algoritma dapat mengasumsikan keduanya:)Jadi:
sumber