Saya harus mengambil daftar (banyak) alamat IP dalam format ini:
134.27.128.0
111.245.48.0
109.21.244.0
dan mengubahnya menjadi format ini dengan pipa di antara (IP dibuat)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Saya pikir itu adalah menemukan dan mengganti perintah seperti sed
tetapi saya tidak bisa membuatnya bekerja.
shell
text-processing
uslesslinuxman
sumber
sumber
tr
menguraikan baris baru ke|
pipa? Suka<ipfile tr \\n \| >outfile
?|
dibutuhkan?<
. Jadi<mydoc tr \\n \| >mydoc2
. Tapi itu tidak akan memberimu ruang. Bagi mereka, mungkin solusi tercepat adalahpaste -d' | ' mydoc /dev/null /dev/null >mydoc2
paste
menulis baris yang sesuai dari setiap file. Tanpa-s
, Anda akan mendapatkan kembali jumlah baris yang Anda miliki di file.Jawaban:
Menggunakan sed, berdasarkan Terkenal Sed Satu-Liners Dijelaskan, Bagian I: : 39. Append garis ke yang berikutnya jika berakhir dengan backslash "\" (kecuali di sini kita mengabaikan bagian tentang garis miring terbalik, dan mengganti
\n
baris dengan diperlukan|
pemisah):harus menghasilkan
mydoc2
sumber
sed 'H;1h;$!d;x;s/\n/ | /g'
linear.sed
ruang pola 8K; itu jauh lebih sedikit dari 16 juta.Saya ingin tahu bagaimana beberapa dari ini (+ beberapa alternatif) bekerja cepat dengan file yang agak besar (
163MiB
, satuIP
per baris, ~ 13 juta baris):Hasil (dengan
sync; echo 3 > /proc/sys/vm/drop_caches
setelah setiap perintah; Saya mengulangi tes - dalam urutan terbalik - setelah beberapa jam tetapi perbedaannya dapat diabaikan; juga perhatikan bahwa saya menggunakangnu sed
):steeldriver :
Sangat lambat. Dibatalkan setelah dua menit menunggu ... jadi tidak ada hasil untuk yang satu ini.
cuonglm :
mikeserv :
jthill :
Avinash Raj :
dan
val0x00ff :
yang artinya
184.321s
. Tidak mengherankan, ini 200 kali lebih lambat dari solusi mikeserv .Berikut ini beberapa cara lain dengan
awk:
perl:
xargs:
kombinasi head + paste + tr + cat:
Jika Anda memiliki
GNU coreutils
dan jika daftar IP Anda tidak terlalu besar (katakanlah hingga 50000 IP), Anda juga dapat melakukan ini denganpr
:dimana
misalnya untuk file 6-baris:
perintah:
output:
sumber
while ... read
loop? Saya ingin tahu apa yang diterjemahkan oleh 163kread()
danwrite()
panggilan dalam patokan. Omong-omong, jawaban yang bagus.sed
tampaknya telah meningkatkan kedudukannya pada waktu itu (dan mungkin hanya memiliki sedikit perubahan pada mesin regexpnya) tetapigrep
tampaknya secara dramatis tertinggal dalam kinerjanya (terutama untuk saluran yang lebih panjang) ? Saya ingin tahu apakahperl
penambahan pada mesinnya memiliki pengaruh pada hasil itu ... Ini juga rapi yangdash
tidak buruk . Yang dibash
sini mungkin akan jauh lebih lambat bersama yang umumIFS=
.lex
dengan benar.Anda dapat menggunakan awk :
ORS=' | '
atur pemisah catatan keluaran menjadi' | '
bukan baris baru.atau edit di tempat dengan
perl
:sumber
paste
kerjanya. sangat dihargai.paste
solusinya adalah yang tercepat.ORS=""
di dalamEND
blok denganORS="\n"
begitu.Jadi saya salah semuanya - dan pertanyaan ini telah mengajari saya banyak hal
paste
. Sebagai cuonglm dengan benar mencatat, kecuali jika Anda beradapaste
di file dalam-s
erial, Anda akan selalu berakhir dengan garis terakhir\n
dari daftar infile Anda ditambahkan ke output seperti yang tertulis. Saya keliru dalam kepercayaan bahwapaste -s
perilaku adalah mode default - dan ini adalah kesalahpahaman yang, tampaknyabusybox
paste
senang untuk diperkuat. Perintah berikut ini berfungsi seperti yang diiklankan denganbusybox
:Namun, itu tidak bekerja sesuai dengan spesifikasi. Sebuah implementasi yang benar
paste
masih akan menambahkan garis\n
akhir untuk setiap urutan yang ditulis. Namun, itu bukan masalah besar:sumber
pr
dalam pikiran tetapi ternyata itu kehabisan uap dengan file input besar jadi saya tidak bisa benar-benar menguji kecepatan tetapi dengan file yang masuk akal panjang itu bekerja OK. Solusi Anda sejauh ini yang tercepat (tidak mengherankan -paste
sangat cepat), lihat posting saya.satu-liner dengan tr dan sed:
sumber
Gunakan
vim
:Penjelasan:
-n
nonaktifkan file swap-u NONE
digunakan untuk melewati semua inisialisasi.-c {command}
jalankan perintah setelah file dibaca.1,$-1s/\n/ | /g
adalahs/\n/ | /g
(ganti baris baru dengan spasi pipa ruang) untuk rentang1,$-1s
(baris 1 ke baris terakhir - 1)wq!
paksa menulis dan berhenticatatan:
Bergantung pada seberapa besar file Anda sebenarnya, ini mungkin ide yang buruk.
sumber
Melalui python.
ruang sebelumnya
print
sangat penting.sumber
Ini satu lagi menggunakan
xxd
sumber
Demi kelengkapan, berikut ini adalah
awk
solusi berbasis- lain , yang ini tidak menggunakanORS
sama sekali:Untuk penjelasan, lihat posting saya di /unix//a/338121/117599 .
sumber