2009-08-13 219 views
47

Necesito editar algunos archivos de texto (una salida de sar) y convertirlos en archivos CSV.Reemplazar espacios en blanco con una coma en un archivo de texto en Linux

Necesito cambiar cada espacio en blanco (tal vez es una pestaña entre los números en la salida) usando las funciones sed o awk (un sencillo script de shell en Linux).

¿Alguien me puede ayudar? Cada comando que utilicé no cambió el archivo en absoluto; Intenté gsub.

Respuesta

19

sin mirar el archivo de entrada, sólo una suposición

awk '{$1=$1}1' OFS="," 

redirigir a otro archivo y cambiar el nombre según sea necesario

+0

Asumo la final 1 después de la llave de cierre es un patrón siempre cierto que imprime la línea? Me gustaría ir con el '{$ 1 = $ 1; imprimir} '. – tzot

+0

sí. es una expresión awk para la condición verdadera que imprime por defecto a stdout. – ghostdog74

8

¿Qué pasa algo como esto:

cat texte.txt | sed -e 's/\s/,/g' > texte-new.txt 

(Sí, con algunos catting y tuberías inútiles, también podría usar < para leer directamente del archivo, supongo - usé cat primero para dar salida al contenido del archivo, y sólo después, he añadido a mi SED de línea de comandos)

EDIT: como @ ghostdog74 señaló en un comentario, hay definitivamente sin necesidad de Thet cat/tubo; se puede dar el nombre del archivo a sed:

sed -e 's/\s/,/g' texte.txt > texte-new.txt 

Si "texte.txt" es de esta manera:

$ cat texte.txt 
this is a text 
in which I want to replace 
spaces by commas 

que obtendrá un "texte-nuevo.txt" que va a tener este aspecto:

$ cat texte-new.txt 
this,is,a,text 
in,which,I,want,to,replace 
spaces,by,commas 

yo no iría simplemente reemplazar el archivo antiguo por uno nuevo (podría hacerse con -i sed, si no recuerdo mal, y como @ ghostdog74 dicho esto, uno podría aceptar creando la copia de seguridad sobre la marcha): mantenimiento podría ser conveniente, como medida de seguridad (incluso si eso significa tener que cambiar el nombre a algo así como "texte-backup.txt")

+1

sin necesidad de cat. sed-e 's/\ s /,/g' teste.txt. Además, si usas GNU sed, puedes usar -i.bak – ghostdog74

+1

Sí, edité mi respuesta mientras publicabas tu comentario, para decir sobre -i (aunque recomendaría no usarlo, para mantener una copia de seguridad del archivo - que siempre puede ser útil); Sin embargo, no pensé en sed miarchivo.txt; buen punto, gracias! –

6

Este comando debería funcionar:

sed "s/\s/,/g" <infile.txt> outfile.txt 

Nota que debe redirigir la salida a un nuevo archivo. El archivo de entrada no se cambia en su lugar.

5

sed puede hacer esto:

sed 's/[\t ]/,/g' input.file 

que enviará a la consola,

sed -i 's/[\t ]/,/g' input.file 

editará el archivo en el lugar

26

intentar algo como:

sed 's/[:space:]+/,/g' orig.txt > modified.txt 

El personaje class [: space:] coincidirá con todos los espacios en blanco (espacios, pestañas, etc.). Si solo quieres reemplazar un solo caracter, ej. solo espacio, use eso solo.

EDITAR: En realidad [: espacio:] incluye retorno de carro, por lo que puede que no haga lo que usted desea. Lo siguiente reemplazará pestañas y espacios.

sed 's/[:blank:]+/,/g' orig.txt > modified.txt 

como se

sed 's/[\t ]+/,/g' orig.txt > modified.txt 

En todo esto, es necesario tener cuidado de que los artículos en su archivo separadas por espacios en blanco no contienen su propio espacio en blanco que desea mantener, p.ej. dos palabras.

+0

no se sed una herramienta orientada a la línea? Si es así, no debería importar que \ n esté incluido en [: space:] –

+11

GNU sed requiere esta sintaxis: sed 's/[[: space:]] \ + /,/g' filename –

+0

@glennjackman gracias por su trabajo ! y complementando su comentario, uso '-r' para' sed -r "s '[[: blank:]] +', 'g" ' –

67
tr ' ' ',' <input >output 

Sustitutos cada espacio con una coma, si es necesario se puede hacer un pase con la bandera -s (repeticiones squeeze), que sustituye a cada secuencia de entrada de un carácter repetido que se muestra en SET1 (el espacio en blanco) con una sola aparición de ese personaje.

uso de repeticiones de compresión usados ​​para después pestañas sustitutos:

tr -s '\t' <input | tr '\t' ',' >output 
+4

No sé el motivo, sin embargo, solo este método que usa "tr" funciona para mi caso. Tanto sed como awk no lograron ocupar espacios en blanco en mi archivo que fue generado por un programa Java. – Leo5188

+0

Awesome one tr '' ',' ...me funciona gracias –

3

Aquí hay un script en Perl que editar los archivos en el lugar:

perl -i.bak -lpe 's/\s+/,/g' files* 

los espacios consecutivos se convierte en una sola coma.
Cada archivo de entrada se mueve a .bak

se utilizan estas opciones de línea de comandos:

  • -i.bak edición in situ y hacer copias .bak

  • -p bucle alrededor de cada línea de el archivo de entrada, imprime automáticamente la línea

  • -l elimina las nuevas líneas antes del procesamiento y las vuelve a agregar adentro luego

  • -e ejecutar el código Perl

Cuestiones relacionadas