Como converter de linha para coluna?

10

Eu tenho um arquivo .txt com números ordenados como este (na mesma linha):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Eu gostaria de convertê-los assim:

106849_01373
106849_01967
106850_00082
23025.7_01059

Não tenho ideia de qual comando usar. Alguém pode me ajudar com isso?

    
por Annemieke Smet 21.03.2016 / 13:43

6 respostas

4

Aqui está uma com xargs

xargs -n1 < file.txt

Demo:

$ 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
    
por souravc 21.03.2016 / 15:46
15

Bastante fácil com tr :

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

Exemplo:

% 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
    
por heemayl 21.03.2016 / 13:49
2

A resposta do heemayl é o caminho a seguir, mas aqui está uma alternativa usando o Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l : ativa o processamento automático de finalização de linha. Tem dois efeitos separados. Primeiro, ele automaticamente efetua chps $ / (o separador de registro de entrada) quando usado com -n ou -p. Segundo, ele atribui $ \ (o separador de registro de saída) para ter o valor de octnum, de forma que quaisquer instruções de impressão tenham esse separador novamente incluído. Se octnum for omitido, define $ \ para o valor atual de $ /.
  • -a : ativa o modo de preenchimento automático quando usado com um -n ou -p. Um comando split implícito para o array @F é feito como a primeira coisa dentro do loop while implícito produzido por -n ou -p.
  • -n : faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que seja iterado sobre argumentos de nome de arquivo como sed -n ou awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e : pode ser usado para inserir uma linha do programa;

  • $,="\n" : define o separador do campo de saída para uma nova linha;
  • print(@F) : imprime os campos separados pelo separador do campo de saída.
% 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
    
por kos 21.03.2016 / 14:24
1

AWK abordagem. Basicamente, alterar o separador de saída para campos e loop. O arquivo de teste é seu exemplo colado repetidamente com ENDLINE no 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
    
por Sergiy Kolodyazhnyy 21.03.2016 / 14:13
1

Usando sed :

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
    
por techraf 21.03.2016 / 13:52
1

Acabei de adicionar uma solução Python para diversão:

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

Este comando executa o script de uma linha do Python 3 em 'aspas simples' com o nome do arquivo que você deseja converter como argumento no final. A sintaxe é assim:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

O script de 1 linha que usamos é este (expandido para várias linhas para maior clareza):

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

Ele importa o módulo sys para ler os argumentos da linha de comando, usa o primeiro argumento fornecido como nome de arquivo para abrir e imprime cada fragmento de dados separados por espaço em branco do arquivo em uma única linha.

$ 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
    
por Byte Commander 21.03.2016 / 15:18