Estoy tratando de eliminar el primer y el último carácter de cada línea en un archivo de texto y guardar la versión truncada resultante en un nuevo archivo. ¿Alguien tiene una idea sobre cómo hacerlo de manera eficiente usando awk
u otros programas / comandos de Linux específicamente para archivos grandes?
input.txt
(s,2,4,5,6)
"s,1,5,5,2"
{z,0,4,5,3}
[y,2,4,5,5]
(y,4,4,5,7)
(r,20,4,5,7)
(e,9,4,5,2)
Salida esperada.txt
s,2,4,5,6
s,1,5,5,2
z,0,4,5,3
y,2,4,5,5
y,4,4,5,79
r,20,4,5,7
e,9,4,5,2
text-processing
sed
awk
pacodelumberg
fuente
fuente
ssed
o el cofre de herramientas Heirloomsed
puede lograr un mejor rendimiento.sed
Según su pregunta, elimine la última y la primera palabra del archivo de entrada de la siguiente manera:
fuente
s/.\(.*\).$/\1/
. Podría ser más rápido debido a que no usa referencias posteriores, y la pregunta mencionó "archivos grandes".time yes | head -n 10000000 | COMMAND >/dev/null
. Tengorev input | cut -c2- | rev | cut -c2-
→ 0.14s,sed 's,.\(.*\).$,\1,'
→ 3.38s;awk '{print substr($0,2,length()-2);}'
→ 3.50s;sed 's/.$//; s/^.//'
→ 5.09s.sed 's/.\(.*\)./\1/'
parece ser más rápido quesed 's/^.\(.*\).$/\1/'
(GNU sed nuevamente). Además, el rendimiento depende de la configuración regional (interpretación de lo que es un personaje) y lased
implementación (en ese sentido, sed del cofre de herramientas de la herencia es considerablemente más rápido que GNU sed).Hay muchas posibilidades, como siempre
Explicación
,
- el delimitador de sed, también puede ser cualquier otro carácter, dado que se escapa donde sea necesario..
Empareja un solo personaje\(.*\)
- Agrupe la parte restante, y esta se almacena para recuperar más..
Empareja un solo personaje de nuevo$
- Fin de la línea\1
- generar el texto que coincide con el grupo de arribag
reemplazar globalmente en la línea.fuente
g
? solo habrá una coincidencia por línea.También puedes hacerlo
awk
si lo prefieresfuente
Esto debería funcionar también. Bien "traduce" cada uno de los caracteres a nada (eliminar).
La desventaja es que los eliminará si no son el primer / último personaje también. También echará de menos los caracteres finales que no incluyas en el
()[...
.fuente