Tengo que tomar una lista (carga) de direcciones IP en este formato:
134.27.128.0
111.245.48.0
109.21.244.0
y convertirlos a este formato con una tubería intermedia (IP compuestas)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Creo que es un comando para buscar y reemplazar, sedpero no puedo hacer que funcione.
shell
text-processing
inútillinuxman
fuente
fuente

trcolocar nuevas líneas en|tuberías? Al igual que<ipfile tr \\n \| >outfile?|requiere el espacio alrededor ?<. Por lo tanto<mydoc tr \\n \| >mydoc2. Pero eso no te conseguirá los espacios. Para aquellos, probablemente la solución más rápida espaste -d' | ' mydoc /dev/null /dev/null >mydoc2pasteescribe líneas correspondientes a cada archivo. Sin-s, obtendrá el número de líneas que tiene en el archivo.Respuestas:
El uso de sed, sobre la base de famosos Sed de una sola línea explicado, Parte I: : 39. Adjuntar una línea a la siguiente si termina con una barra invertida "\" (salvo que aquí no hacemos caso de la parte de la barra invertida, y reemplazar las
\nnuevas líneas con el|separador requerido ):debe producir en
mydoc2fuente
sed 'H;1h;$!d;x;s/\n/ | /g'es linealsedespacio de patrón de 8K; eso es mucho menos de 16 millones.Tenía curiosidad por ver cómo algunos de estos (+ algunas alternativas) funcionan de manera rápida con un archivo bastante grande (
163MiB, unoIPpor línea, ~ 13 millones de líneas):Resultados (con
sync; echo 3 > /proc/sys/vm/drop_cachesdespués de cada comando; repetí las pruebas, en orden inverso, después de un par de horas, pero las diferencias fueron insignificantes; también tenga en cuenta que estoy usandognu sed):conductor de acero :
muy lento. Cancelado después de dos minutos de espera ... así que no hay resultado para este.
cuonglm :
mikeserv :
jthill :
Avinash Raj :
y
val0x00ff :
cuyos medios
184.321s. Como era de esperar, esto es 200 veces más lento que la solución de mikeserv .Aquí hay otras formas con
awk:
perl:
xargs:
una combinación de head + paste + tr + cat:
Si tiene
GNU coreutilsy si su lista de IP no es realmente enorme (digamos hasta 50000 IP), también puede hacer esto conpr:dónde
por ejemplo, para un archivo de 6 líneas:
El comando:
salidas:
fuente
while ... readbucle? Tengo curiosidad por ver a qué se traduce 163kread()ywrite()llamadas en un punto de referencia. Gran respuesta, por cierto.sedparece haber mejorado su posición en ese momento (y probablemente solo hubo unos pocos cambios en su motor regexp) perogrepparece haberse retrasado drásticamente en su rendimiento (especialmente para las líneas más largas) ? Me pregunto si lasperladiciones a su motor tienen alguna relación con esos resultados ... También es bueno quedashno sea abismal . Elbashaquí probablemente sería mucho más lento con lo comúnIFS=antepuesto.lexcorrectamente.Puedes usar awk :
ORS=' | 'establezca el separador de registro de salida en' | 'lugar de nueva línea.o editar en el lugar con
perl:fuente
pastefunciona. muy apreciado.pastesolución es la más rápida.ORS=""dentro delENDbloqueORS="\n"para que así sea.Así que me equivoqué todo, y esta pregunta me ha enseñado mucho
paste. Como cuonglm señala correctamente, a menos que estépasteen un archivo in-serial, siempre terminará con la última línea\nelectrónica de su lista de archivos añadida a la salida a medida que se escribe. Me equivoqué al creer que elpaste -scomportamiento era su modo predeterminado, y este es un concepto erróneo que, aparentemente,busyboxpasteestaba feliz de reforzar. El siguiente comando funciona como se anuncia conbusybox:Sin embargo, no funciona según las especificaciones. Una implementación correcta
pasteaún\nagregaría una línea electrónica final para cada secuencia escrita. Aún así, eso no es gran cosa después de todo:fuente
pren mente, pero aparentemente se queda sin vapor con grandes archivos de entrada, por lo que no pude probar la velocidad, pero con archivos de longitud razonable funciona bien. Su solución es, con mucho, la más rápida (no es de extrañar,pastees realmente rápida), vea mi publicación.one-liner con tr y sed:
fuente
Utilizar
vim:Explicación:
-ndesactivar el archivo de intercambio-u NONEse usa para omitir todas las inicializaciones.-c {command}ejecutar comandos después de que se haya leído el archivo.1,$-1s/\n/ | /gess/\n/ | /g(reemplace nueva línea con espacio de tubería) para el rango1,$-1s(1ra línea a la última línea - 1)wq!forzar la escritura y salirNota:
Dependiendo de qué tan grande sea realmente su archivo, esto puede ser una mala idea.
fuente
A través de pitón.
espacios antes
printera muy importante.fuente
Aquí hay otro usando
xxdfuente
Para completar, aquí hay otra
awksolución basada en esta, esta no está usando elORS:Para obtener una explicación, consulte mi publicación en /unix//a/338121/117599 .
fuente