Saya memiliki serangkaian url yang sangat panjang tanpa karakter pemisah, dalam format yang sama seperti di bawah ini:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Saya ingin setiap URL berada di baris baru. Saya mencoba melakukan ini dengan mengganti semua contoh "http: //" dengan "\ nhttp: //" menggunakan sed
sed 's_http://_\nhttp://_g' urls.txt
tetapi kesalahan segmentasi terjadi (pelanggaran memori). Saya hanya dapat menduga bahwa ukuran file yang sebenarnya (lebih dari 100GB) menyebabkan jumlah melebihi batas tertentu.
Saya dapat membagi file menjadi beberapa file yang lebih kecil untuk diproses, tetapi semua contoh "http: //" harus tetap utuh.
Apakah ada cara yang lebih baik untuk melakukan ini?
text-processing
sed
C Sawyer
sumber
sumber
Jawaban:
Dengan
awk
Anda dapat menghindari membaca sejumlah besar teks sekaligus:Keberhasilan mungkin tergantung pada
awk
implementasi yang digunakan . Misalnyagawk
berfungsi dengan baik, tetapimawk
crash.sumber
Ini akan melakukan pekerjaan:
Dengan menetapkan $ / , saya telah mengubah definisi sebuah baris sehingga berakhir dengan
//
alih - alih sebuah baris baru. Ini membuat Perl membaca satu URL setiap kali. Tidak mungkin URL berisi//
kecuali setelah skema, tetapi tidak apa-apa jika ada, regex akan mencegahnya menambahkan baris baru palsu.Jika Anda ingin menghindari menambahkan baris kosong sebelum URL pertama:
Anda dapat mencoba membuat tolok ukur untuk melihat apakah
s!http://\z!\nhttp://!
lebih cepat. Mereka setara. Perhatikan bahwa/g
bendera tidak diperlukan pada substitusi, karena hanya ada satu pertandingan per "baris".sumber
$/
, itu hanya akan berurusan dengan satu URL pada suatu waktu.man perlvar
, tetapi masuk akal seperti itu.http:
bagian di regex. Ini akan memeriksa setiap//
, tetapi tidak akan menambah baris baru kecuali jika ditemukanhttp://
.:
dengan baris baru, untuk memotong file.http
di akhir baris denganhttp:
dan tambahkan baris berikutnyaLangkah-langkah ini terlihat seperti:
Periksa apakah ada garis yang tidak dimulai
http://
, cetak nomor baris. Ini hanya akan terjadi jika a: ada di suatu tempat di URL selain setelahhttp
.grep -nv '^http://'
sumber