Saya memiliki dokumen teks yang memiliki banyak teks yang memiliki ruang tambahan ditambahkan setelah setiap huruf!
Contoh:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t…
Secara visual:
T␣h␣e␣␣b␣o␣o␣k␣␣a␣l␣s␣o␣␣h␣a␣s␣␣a␣n␣␣a␣n␣a␣l␣y␣t␣i ␣c␣a␣l␣␣p␣u␣r␣p␣o␣s␣e␣␣w␣h␣i␣c␣h␣␣i␣s␣␣m␣o␣r␣e␣␣i␣ m␣p␣o␣r␣t␣a␣n␣t…
Perhatikan bahwa ada spasi tambahan setelah setiap huruf, jadi ada dua spasi di antara kata-kata yang berurutan.
Apakah ada cara saya bisa mendapatkan awk
atau sed
menghapus ruang ekstra? (Sayangnya dokumen teks ini sangat besar dan akan memakan waktu yang sangat lama untuk dilakukan secara manual.)
Saya menghargai bahwa ini mungkin masalah yang jauh lebih kompleks untuk diselesaikan hanya dengan skrip bash sederhana karena harus ada semacam pengenalan teks juga.
Bagaimana saya bisa mendekati masalah ini?
text-processing
sed
awk
scripting
rendah hati
sumber
sumber
echo 't h i s i s a n e x a m p l e' | sed 's/ //g'
echo 'T h i s ; i s .a n 9 8 e x a m p l e' | perl -pe 's/[a-z]\K (?=[a-z])//ig'
Jawaban:
Regex berikut akan menghapus spasi pertama dalam string spasi apa pun. Itu harus melakukan pekerjaan.
Jadi sesuatu seperti:
... akan mengganti infile.txt dengan versi "tetap".
sumber
perl -pie
- seperti yang ditunjukkan oleh hasil edit Anda. Apa alasannya? -Pie selalu bekerja dengan baik untuk saya, dan merupakan mnemonik yang hebat. Apakah perilaku saya berubah untuk memperlakukan apa pun yang mengikuti sebagai ekstensi, bukan hanya hal-hal yang dimulai dengan titik? Tampaknya aneh bagi mereka untuk memecahkan sesuatu yang begitu idiomatis.-i
. Di sisi lain, saya hanya pernah menggunakannya di mesin Linux dan saya belum mengetahuinya selama lebih dari beberapa tahun, jadi saya tidak dapat berbicara tentang perilaku yang lebih lama. Pada meskipun mesin saya, ini:perl -pie 's/a/b/' f
, menghasilkan kesalahan:Can't open perl script "s/o/A/": No such file or directory
. Sementaraperl -i -pe 's/o/A/' f
bekerja seperti yang diharapkan. Jadi ya,e
ini diambil sebagai ekstensi cadangan.Gunakan
wordsegment
, paket NLP segmentasi kata Python murni:sumber
Berdasarkan fakta bahwa input mencakup spasi ganda antar kata, ada solusi yang lebih sederhana. Anda cukup mengubah spasi ganda menjadi karakter yang tidak digunakan, menghapus spasi dan mengubah karakter yang tidak digunakan kembali ke spasi:
... keluaran:
sumber
sed -e "s/\([^ ]\) /\1/g"
Perl untuk menyelamatkan!
Anda memerlukan kamus, yaitu file yang mencantumkan satu kata per baris. Di sistem saya, itu ada sebagai
/var/lib/dict/words
, saya juga melihat file yang sama seperti/usr/share/dict/british
dll.Pertama, Anda mengingat semua kata dari kamus. Kemudian, Anda membaca baris input demi baris, dan mencoba menambahkan karakter ke sebuah kata. Jika mungkin, Anda ingat kata itu dan mencoba menganalisis sisa kalimat. Jika Anda mencapai ujung garis, Anda menampilkan garis.
Untuk masukan Anda, ini menghasilkan 4092 kemungkinan bacaan di sistem saya.
sumber
a cat a log
yaitua c a t a l o g
Catatan: jawaban ini (seperti beberapa yang lain di sini) didasarkan pada versi sebelumnya dari pertanyaan di mana kata-kata tidak dibatasi. Versi yang lebih baru bisa dijawab sepele .
Pada input seperti:
Kamu bisa mencoba:
Ia memproses dari kiri ke kanan dan menemukan satu kata terpanjang setelah kata berikutnya.
Jelas, di sini, ini bukan pilihan kata yang terbaik karena kalimat itu tidak masuk akal, tetapi untuk membuat yang tepat, Anda memerlukan alat yang dapat memahami tata bahasa atau makna teks atau setidaknya beberapa statistik informasi tentang kata-kata apa yang mungkin ditemukan bersama untuk menghasilkan kumpulan kata yang paling mungkin. Sepertinya solusinya adalah perpustakaan khusus seperti yang ditemukan oleh Lynn
sumber
Mirip dengan versi Dewi Morgan, tetapi dengan sed:
sumber
sed
hanya GNU dan itu tidak setara dengan Dewi.sed
Setara standar dari Dewi adalahsed 's/ \( *\)/\1/g'
Meskipun bisa (dan harus) dilakukan dengan Perl one-liner, parser C kecil juga akan sangat cepat, dan juga sangat kecil (dan mudah-mudahan sangat benar):
Disusun dengan
(programnya sedikit kurang dari 9kb)
Gunakan dalam pipa seperti misalnya:
sumber
Saya mencoba ini dan sepertinya berhasil:
The
sed
perintah menangkap dua kelompok dan kembali hanya yang pertama.sumber
Dalam c ++, saya akan melakukan ini:
Akan mengubah isi file teks uji, menjadi string yang sama, tetapi dengan spasi antara huruf dihapus. (Ini membutuhkan ruang antara setiap huruf untuk menjadi akurat).
sumber
sumber