GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Es posible con Gedit o la línea de comandos modificar cada cuarta línea de un archivo de texto?

Estoy tratando de convertir un archivo de texto en una hoja de cálculo separada por tabulaciones. Mi archivo de texto es algo como esto:

Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana

Con las funciones estándar de búsqueda y reemplazo en Gedit o LibreOffice, es fácil reemplazar el final de la línea con una pestaña. Pero si solo cambio los retornos de carro por tabulaciones, obtendré esto:

Dog   Cat   Fish   Lizard
Wolf   Lion   Shark   Gecko  
Coyote   Puma   Eel   Iguana

Pero lo que tengo que hacer es conseguir que se vea así:

Dog   Cat   Fish   Lizard
Wolf   Lion   Shark   Gecko  
Coyote   Puma   Eel   Iguana

Entonces, ¿puedo cambiar cada carácter de final de línea por una pestaña excepto por cada cuarta línea?

No sé si ese tipo de iteración condicional se puede hacer con expresiones regulares dentro de un programa como Gedit o LibreOffice, así que tal vez esto deba ser algún tipo de función de línea de comando. Ni siquiera tengo claro cuál es la mejor herramienta para empezar.

Actualización:

Probé los siguientes comandos:

sed 'N;N;N;s/\n/\t/g' file > file.tsv

paste - - - - < file > file.tsv

pr -aT -s$'\t' -4 file > file.tsv

xargs -d '\n' -n4 < inputfile.txt

Pero cuando intento abrir el tsv resultante archivo en LibreOffice, las columnas no están del todo bien. No estoy seguro si esto significa que no estoy ejecutando correctamente los comandos anteriores o si estoy haciendo algo mal en la función de importación de LibreOffice:

Solo como referencia, el resultado deseado debería verse así:

Respuesta aceptada:

podrías use un editor de línea de comandos como sed

sed 'N;N;N;s/\n/\t/g' file > file.tsv

o, más programáticamente, agregando una barra invertida caracteres de continuación de línea a cada una de las líneas que desea unir utilizando n skip m de GNU sed operador de dirección y seguirlo con el clásico one-liner para unir líneas continuas:

sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'

Véase, por ejemplo, Explicación de Sed One-Liners:

  1. Agregue una línea a la siguiente si termina con una barra invertida "\".

    sed -e :a -e '/\\$/N; s/\\\n//; ta'
    

Sin embargo, en mi humilde opinión, sería más fácil con una de las otras utilidades de procesamiento de texto estándar, por ejemplo,

paste - - - - < file > file.tsv

(el número de - corresponderá al número de columnas) o

pr -aT -s$'\t' -4 file > file.tsv

(puede omitir -s$'\t si no le importa que la salida esté separada por varias pestañas).

Es casi seguro que el extraño comportamiento de reimportación que está observando se debe a que el archivo original tiene finales de línea CRLF al estilo de Windows. Si necesita trabajar con archivos de Windows, puede realizar la conversión en el comando de varias maneras, por ejemplo,

tr -d '\r' < file.csv | paste - - - -

o

sed 'N;N;N;s/\r\n/\t/g' file.csv

El primero eliminará TODOS los retornos de carro, mientras que el segundo conservará un CR al final de cada una de las nuevas líneas (que puede ser lo que desee si el usuario final previsto está en Windows).

Relacionado:¿La tableta gráfica Wacom Cth-480/Ctl-480 no se detecta en Ubuntu 13.10 en Ubuntu?
Ubuntu
  1. ejecutando un comando contra cada línea en un archivo de texto

  2. Descargue un archivo en Ubuntu usando la línea de comandos en el sistema Ubuntu 20.04

  3. Texto de archivo múltiple ¿Reemplazar con Sed?

  4. Crear archivos usando la línea de comando en Linux

  5. CentOS/RHEL 7:Cómo modificar la línea de comandos del kernel

Cómo descargar un archivo en Ubuntu usando la línea de comandos

Manipulación de texto en la línea de comando con grep

Seguimiento del tiempo con Timewarrior en la línea de comandos

Cómo descargar un archivo en Ubuntu Linux usando la línea de comandos

Ver el contenido de un archivo en la línea de comandos de Linux

¿El comando Cat no muestra las líneas del texto?