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.


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.

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.


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

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

7

Con GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

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.


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


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

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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.