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, sed
pero no puedo hacer que funcione.
shell
text-processing
inútillinuxman
fuente
fuente
tr
colocar 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 >mydoc2
paste
escribe 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
\n
nuevas líneas con el|
separador requerido ):debe producir en
mydoc2
fuente
sed 'H;1h;$!d;x;s/\n/ | /g'
es linealsed
espacio 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
, unoIP
por línea, ~ 13 millones de líneas):Resultados (con
sync; echo 3 > /proc/sys/vm/drop_caches
despué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 coreutils
y 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 ... read
bucle? Tengo curiosidad por ver a qué se traduce 163kread()
ywrite()
llamadas en un punto de referencia. Gran respuesta, por cierto.sed
parece haber mejorado su posición en ese momento (y probablemente solo hubo unos pocos cambios en su motor regexp) perogrep
parece haberse retrasado drásticamente en su rendimiento (especialmente para las líneas más largas) ? Me pregunto si lasperl
adiciones a su motor tienen alguna relación con esos resultados ... También es bueno quedash
no sea abismal . Elbash
aquí probablemente sería mucho más lento con lo comúnIFS=
antepuesto.lex
correctamente.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
paste
funciona. muy apreciado.paste
solución es la más rápida.ORS=""
dentro delEND
bloqueORS="\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épaste
en un archivo in-s
erial, siempre terminará con la última línea\n
electrónica de su lista de archivos añadida a la salida a medida que se escribe. Me equivoqué al creer que elpaste -s
comportamiento era su modo predeterminado, y este es un concepto erróneo que, aparentemente,busybox
paste
estaba feliz de reforzar. El siguiente comando funciona como se anuncia conbusybox
:Sin embargo, no funciona según las especificaciones. Una implementación correcta
paste
aún\n
agregaría una línea electrónica final para cada secuencia escrita. Aún así, eso no es gran cosa después de todo:fuente
pr
en 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,paste
es realmente rápida), vea mi publicación.one-liner con tr y sed:
fuente
Utilizar
vim
:Explicación:
-n
desactivar el archivo de intercambio-u NONE
se usa para omitir todas las inicializaciones.-c {command}
ejecutar comandos después de que se haya leído el archivo.1,$-1s/\n/ | /g
ess/\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
print
era muy importante.fuente
Aquí hay otro usando
xxd
fuente
Para completar, aquí hay otra
awk
solución basada en esta, esta no está usando elORS
:Para obtener una explicación, consulte mi publicación en /unix//a/338121/117599 .
fuente