11 votos

¿Cómo convertir de fila a columna?

Tengo un archivo .txt con números ordenados así (en la misma fila):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Me gustaría convertirlos así:

106849_01373
106849_01967
106850_00082
23025.7_01059

No tengo ni idea de qué comando utilizar. ¿Puede alguien ayudarme con esto?

16voto

heemayl Puntos 21116

Bastante fácil con tr :

tr -s '[:blank:]' '\n' <file.txt

Ejemplo:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

6voto

souravc Puntos 9854

Aquí hay uno con xargs

xargs -n1 < file.txt

Demostración:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1 votos

Xargs es una gran herramienta, y si no lo hubieras mencionado, lo habría hecho, pero tiene un inconveniente en que si omites el comando lo sustituye por echo (que a diferencia de algunos shells, xargs no tiene un echo incorporado) y -n1 le dice a xargs que llame al comando para cada arg, así que con este ejemplo tendrías un mínimo de seis procesos involucrados (el Shell para hacer la redirección io, xargs, y cuatro echos). Esto no es tan malo en este ámbito, pero es considerablemente más lento en un par de miles de líneas de salida.

2voto

ieplugin Puntos 216

La respuesta de heemayl es el camino a seguir, sin embargo aquí hay una alternativa usando Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l : permite el procesamiento automático del final de línea. Tiene dos efectos distintos. En primer lugar, elimina automáticamente $/ (el separador de registros de entrada) cuando se utiliza con -n o -p. En segundo lugar, asigna a $\ (el separador de registros de salida) el valor de octnum para que cualquier sentencia de impresión tenga ese separador añadido. Si se omite octnum, asigna a $\ el valor actual de $/.

  • -a : activa el modo de división automática cuando se utiliza con -n o -p. Una orden de división implícita a la matriz @F se realiza como lo primero dentro del bucle while implícito producido por el -n o -p.

  • -n : hace que Perl asuma el siguiente bucle alrededor de su programa, lo que hace que itere sobre los argumentos de los nombres de archivo de forma similar a sed -n o awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e : puede utilizarse para introducir una línea de programa;

  • $,="\n" : establece el separador del campo de salida en una nueva línea;

  • print(@F) imprime los campos separados por el separador de campos de salida.

    % cat file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059 % perl -lane '$,="\n"; print(@F)' file.txt 106849_01373 106849_01967 106850_00082 23025.7_01059

1voto

Serg Puntos 17677

AWK enfoque. Básicamente cambiando el separador de salida para los campos, y haciendo un bucle. El archivo de prueba es su ejemplo pegado una y otra vez con ENDLINE al final

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1voto

Byte Commander Puntos 9266

Acabo de añadir una solución Python para la diversión:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Este comando ejecuta una línea de secuencia de comandos de Python 3 en 'comillas simples' con el nombre de archivo que desea convertir como argumento en la final. La sintaxis es como este:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

A la 1 de la línea de secuencia de comandos que uso es este (ampliado a múltiples líneas para mayor claridad):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

Importa el sys módulo de leer los argumentos de línea de comandos, se lleva el primer argumento dado como nombre de archivo para abrir y se imprime cada espacio en blanco separados fragmento de datos desde el archivo en una sola línea.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X