Supongamos que tengo un archivo:
Archivo1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 quiero:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Filas a la conversión de columna de File1.
Supongamos que tengo un archivo:
Archivo1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 quiero:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Filas a la conversión de columna de File1.
Respuestas:
Utilizando tr
, reemplace cada carácter de espacio repetido ( ) con un solo carácter de nueva línea (
\n
).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 d%
Con lo awk
que podríamos hacer:
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
Esto une todas las mismas posiciones de número archivadas e END
imprime el resultado que sería la primera fila en la primera columna, la segunda fila en la segunda columna, etc. Por supuesto, el archivo de entrada está limitado al tamaño de su memoria.
Simplemente podrías hacer esto a través de grep. Por defecto grep, imprimiría la coincidencia en una nueva línea separada.
grep -oP '\S+' infile > outfile
O
grep -o '[^[:space:]]\+' infile > outfile
grep
También puedes usar el fmt
comando:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Con GNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
Parece la mejor herramienta para la tarea, ¡pero fascinante cuántas otras herramientas podrían usarse!
También puedes hacer esto usando sed
:
$ sed -e 's/ */\n/g' file1 > file2
NOTA: No maneja la situación donde las palabras contienen espacios.
\n
como nueva línea
Utilizando awk
, estableciendo el separador de campo de salida ( OFS
) como el separador de registro (línea) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Usando un for
bucle:
for val in `cat file1` ; do echo $val >> file2; done;
También puedes intentar usar sed
$ sed -i.bak s@' '@'\n'@g infile.txt
Tenga en cuenta que estoy usando @
como separador para la operación de sustitución. Esto también creará un archivo de respaldo. En caso de que no necesite una copia de seguridad, elimine .bak
$ sed -i s@' '@'\n'@g infile.txt
Versión de Python:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
Esto usa la <
redirección al stdin de python input.txt
y escribe para output.txt
usar la >
redirección. El one-liner en sí lee todas las líneas de stdin
una lista de cadenas, donde todos los espacios se reemplazan con nuevas líneas, y reconstruimos todo el texto usando la .join()
función.
El enfoque alternativo para evitar que se reemplacen múltiples espacios en serie con líneas nuevas es utilizar .split()
para dividir la línea en una lista de palabras. De esa manera, podemos asegurarnos de que cada palabra esté separada solo por una nueva línea
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Usando xargs
, (robado de la respuesta de souravc ):
xargs -n 1 < File1 > File2
O si se necesita algún reformateo menor, use printf
cadenas de formato como sea necesario:
xargs printf '%s\n' < File1 > File2
Mi solución sería:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done