¿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?

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

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

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

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

1

Utilizando sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

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
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.