Filas a columna de conversión de archivo

15

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.

yisha
fuente
Si su archivo consta de más de una línea y su salida debería tener más de una columna, intente con este script AWK .
Pausado hasta nuevo aviso.
Pregunta muy relacionada: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Respuestas:

20

Utilizando tr, reemplace cada carácter de espacio repetido ( ) con un solo carácter de nueva línea ( \n).

tr -s ' '  '\n'< infile > outfile

Pero creo que quieres algo como esto?

1 2 3 4 1 a #
abcd -> 2 b $
# $ @% 3 c @
                4 d%

Con lo awkque 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 ENDimprime 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.

αғsнιη
fuente
Intenté con los mismos datos y código, imprimió la última columna como primer registro como 4 d% y luego el segundo registro 1 a # y así sucesivamente.
Abhinay el
8

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
Avinash Raj
fuente
1
+1 para uso creativo degrep
Volker Siegel
8

También puedes usar el fmtcomando:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
fredtantini
fuente
7

Con GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Cuonglm
fuente
datamashParece la mejor herramienta para la tarea, ¡pero fascinante cuántas otras herramientas podrían usarse!
Mark Stewart
6

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.

slm
fuente
Esto requiere GNU sed, lo mejor que puedo decir. El que se envía con mac (BSD) no se ve \ncomo nueva línea
D. Ben Knoble
5

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
jasonwryan
fuente
2

Usando un forbucle:

for val in `cat file1` ; do echo $val >> file2; done;
Mandar Shinde
fuente
0

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
Vaibhav Shetye
fuente
0

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.txty escribe para output.txtusar la >redirección. El one-liner en sí lee todas las líneas de stdinuna 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
Sergiy Kolodyazhnyy
fuente
0

Usando xargs, (robado de la respuesta de souravc ):

xargs -n 1 < File1 > File2

O si se necesita algún reformateo menor, use printfcadenas de formato como sea necesario:

xargs printf '%s\n' < File1 > File2
agc
fuente
0

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
Saumyakanta Sahoo
fuente
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
fuente