¿Cómo convertir de fila a columna?

11

Tengo un archivo .txt con números ordenados de esta manera (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 idea de qué comando usar. puede alguien ayudarme con esto?

Annemieke Smet
fuente

Respuestas:

5

Aquí hay uno con xargs

xargs -n1 < file.txt

Manifestació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
souravc
fuente
1
xargs es una gran herramienta, y si no lo hubiera mencionado, lo habría hecho, pero tiene un inconveniente, ya que si omite el comando, sustituye echo (que a diferencia de algunos shells, xargs no tiene eco incorporado) y -n1 le dice a xargs que llame al comando para cada argumento, por lo que con este ejemplo tendría un mínimo de seis procesos involucrados (el shell para hacer la redirección io, xargs y cuatro ecos). Esto no es tan malo en este ámbito, pero es considerablemente más lento con un par de miles de líneas de salida.
hildred
16

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

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

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: habilita el procesamiento automático de final de línea. Tiene dos efectos separados. Primero, automáticamente divide $ / (el separador de registro de entrada) cuando se usa con -n o -p. En segundo lugar, asigna $ \ (el separador de registro de salida) para tener el valor de octnum, de modo que cualquier declaración de impresión tendrá ese separador agregado nuevamente. Si se omite octnum, establece $ \ en el valor actual de $ /.
  • -a: activa el modo de división automática cuando se usa con -n o -p. Un comando de división implícito para la matriz @F se realiza como lo primero dentro del bucle while implícito producido por -n o -p.
  • -n: hace que Perl asuma el siguiente ciclo alrededor de su programa, lo que lo hace iterar sobre argumentos de nombre de archivo algo así como sed -n o awk:

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

  • $,="\n": establece el separador de campo de salida en una nueva línea;
  • print(@F): imprime los campos separados por el separador de campo 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
kos
fuente
1

AWKAcercarse. Básicamente, cambiar el separador de salida para campos y bucles. 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
Sergiy Kolodyazhnyy
fuente
1

Utilizando sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
techraf
fuente
No del todo ... agregaría una nueva línea final después de cada línea (inicial) ...
heemayl
Verifique con varias líneas, obtendría un caso claro entonces ...
heemayl
¿Podría agregar un ejemplo con su respuesta ..
heemayl
@heemayl Querías decir que convertiría los espacios finales en nuevas líneas. Su sintaxis no hace que sea fácil de entender. : /
techraf
1

Solo agrego una solución de Python por diversión:

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

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

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

El script de 1 línea que utilizamos es el siguiente (expandido a varias líneas para mayor claridad):

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

Importa el sysmódulo para leer argumentos de línea de comandos, toma el primer argumento dado como nombre de archivo para abrir e imprime cada fragmento de datos separados por espacios en blanco del 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
Byte Commander
fuente