Tengo una serie muy larga de URL sin caracteres de separación, en el mismo formato que a continuación:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Quiero que cada URL esté en una nueva línea. Traté de hacer esto reemplazando todas las instancias de "http: //" con "\ nhttp: //" usando sed
sed 's_http://_\nhttp://_g' urls.txt
pero ocurre una falla de segmentación (violación de memoria). Solo puedo suponer que el tamaño del archivo (más de 100 GB) está causando que sed supere algún límite.
Podría dividir el archivo en varios archivos más pequeños para su procesamiento, pero todas las instancias de "http: //" tendrían que mantenerse intactas.
¿Hay una mejor manera de hacer esto?
text-processing
sed
C Sawyer
fuente
fuente
Respuestas:
Con
awk
usted puede evitar leer una gran cantidad de texto a la vez:El éxito puede depender de la
awk
implementación utilizada . Por ejemplogawk
funciona bien, pero semawk
bloquea.fuente
Esto hará el trabajo:
Al establecer $ / , he cambiado la definición de una línea para que termine en
//
lugar de una nueva línea. Esto hace que Perl lea una URL a la vez. Es poco probable que una URL contenga,//
excepto después del esquema, pero está bien si uno lo hace, la expresión regular evitará que agregue nuevas líneas espurias.Si desea evitar agregar una línea en blanco antes de la primera URL:
Puede probar la evaluación comparativa para ver si
s!http://\z!\nhttp://!
es más rápido. Son equivalentes. Tenga en cuenta que la/g
bandera no es necesaria en la sustitución, porque solo puede haber una coincidencia por "línea".fuente
$/
, solo se tratará de una URL a la vez.man perlvar
, pero tiene sentido de esa manera.http:
parte de la expresión regular. Examinará todos//
, pero no agregará una nueva línea a menos que encuentrehttp://
.:
con una nueva línea, para cortar el archivo.http
al final de la línea conhttp:
y agregue la siguiente líneaEstos pasos se ven así:
Compruebe si hay líneas que no comienzan
http://
, imprima los números de línea. Esto solo ocurriría si a: está en algún lugar de la URL que no sea después dehttp
.grep -nv '^http://'
fuente