Estoy tratando de convertir un archivo de texto en una hoja de cálculo separada por pestañas. 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 línea con una pestaña. Pero si solo cambio los retornos de carro por pestañas, obtendré esto:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Pero lo que tengo que hacer es 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, ¿entonces 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 comenzar.
Actualizar:
Intenté 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 trato de abrir el tsv
archivo resultante en LibreOffice, las columnas no están del todo bien. No estoy seguro de si esto significa que no estoy ejecutando los comandos anteriores correctamente, 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í:
fuente
dos2unix
yunix2dos
.Puede usar
xargs
para agrupar siempre cuatro líneas en una, separadas con un solo espacio cada una:-d '\n'
establece el delimitador de entrada en un carácter de nueva línea, de lo contrario, también se rompería en espacios. Si de todos modos solo tiene una palabra por línea de entrada, incluso puede omitir esto.-n4
establece el número de argumento (el número de elementos de entrada por línea de salida) en 4.Salida:
O si desea pestañas como separadores en lugar de un espacio, puede reemplazarlos después. Sin embargo, si tuviera espacios en sus líneas de entrada, también se reemplazarían:
Salida (mirar dependiendo del ancho de la pestaña del navegador / terminal):
fuente
También puedes usar:
Las dos variables incorporadas awk son:
ORS
: O utput R ECORD S eparator (por defecto = salto de línea). Se agrega al final de cada comando de impresión.NR
: N umber de la corriente R ow awk está procesando.Este comando, para cada línea, mostrará el contenido de la primera columna (y aquí solo). Luego elige agregar una nueva línea o una pestaña probando el resto de la división de
NR
por 4.fuente
Otro
awk
enfoque más corto :Este printf sólo una columna seguida por el siguiente y el siguiente y ... y una lengüeta de
\t
carácter después cada uno, pero será printf un\n
carácter ewline cuando N úmero de R ECORD era el factor de 4 (en la queNR%4
devolverá 0 (falso), que es lo ternario operadorcondition(s)?when-true:when-false
está haciendo.)fuente
Mi solución a esto sería usar la combinación de
sed
ysed
. Primero, puede marcar cada cuarta línea con algún carácter especial, por ejemplo>
, usando esta solución:En este caso, desea comenzar desde la línea 5 y marcar cada 4ta línea después de ella. En GNU
sed
eso se puede dar como una dirección5~4
. Puedes usar este comando:Luego debe eliminar las nuevas líneas, lo que se puede hacer con un
sed
bucle:Hay formas más fáciles de convertir nuevas líneas a algún otro personaje, por ejemplo con
tr
:De cualquier manera, combinando los dos da
(la
sed
versión deja una nueva línea final, mientras que latr
versión no)Después de eso, solo necesita convertir los caracteres especiales que insertó en nuevas líneas; consulte, por ejemplo, Convertir un archivo delimitado por tabuladores para usar líneas nuevas . En este caso, cambie
>
a nuevas líneas:El
y
comando realiza la misma función quetr
, transformando un personaje en otro, pero puede usar els
comando aquí igualmente bien. Cons
, debeg
operar en cada partido en la línea (sed 's/>/\n/g'
).En lugar de hacer dos archivos intermedios, puede usar tuberías:
Si los espacios finales son un problema, puede agregar otro comando para eliminarlos:
fuente
En aras de la "integridad" aquí hay una solución de bash puro:
Funciona también con espacios, suponiendo que
IFS
esté configurado correctamente (que debería, por defecto, AFAIK). Además, creo que esto podría incluso ser un script de shell portátil y funcionar con cualquier shell compatible con POSIX.fuente
$'
'
POSIX no requiere la forma de cotización. Por ejemplo, endash
(que proporcionash
por defecto en Ubuntu), ejecutandoprintf '%s\n' $'a\tb'
solo salidas$a\tb
. Sin embargo, eso no significa que esto no sea útil; funciona en bash. Sin embargo, como con algunas de las otras soluciones que la gente ha publicado, produce resultados incompletos si el número de líneas de entrada no es múltiplo de cuatro. Además, recomiendo usarread -r
, ya que no hay razón para pensar que la expansión de las barras invertidas en el archivo de entrada se desee aquí.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Una macro vim (grabada con q) podría aplicar su operación, luego omitir tres líneas. Luego, solo ejecuta esa macro n veces.
p.ej:
fuente
Como solicitó una solución de Gedit, algo como esto debería funcionar:
Encontrar:
Reemplazar con:
Asegúrese de que la casilla de verificación para las expresiones regulares esté marcada.
Cómo funciona:
El primer paso es encontrar una serie de caracteres de palabras, con \ w +, y capturar los resultados en la variable \ 1 colocando paréntesis alrededor de la expresión:
A continuación buscamos una serie de caracteres finales de línea, \ r y \ n, o CR y LF. Dado que los archivos con formato de Windows usan ambos, creamos una clase de caracteres envolviendo estos dos caracteres entre corchetes. La ventaja hace que busque uno o más caracteres:
Finalmente, repetimos esto 3 veces más, almacenando cada palabra subsiguiente en las variables \ 2, \ 3 y \ 4. Esto hace que nuestro reemplazo con expresión sea simple. Solo necesitamos colocar los caracteres de tabulación, \ t, y un nuevo carácter de línea, \ n, en los lugares apropiados para el formato que necesita.
fuente