Como converter de linha em coluna?

11

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 idéia de qual comando usar. Alguém pode me ajudar com isso?

Annemieke Smet
fonte

Respostas:

5

Aqui está um 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
souravc
fonte
1
O xargs é uma ótima ferramenta, e se você não o tivesse mencionado, eu o teria, mas ele tem uma desvantagem: se você omitir o comando, ele substitui o eco (que, diferentemente de alguns shells, o xargs não possui um eco interno) e -n1 diz ao xargs para chamar o comando para cada argumento, portanto, neste exemplo, você teria um mínimo de seis processos envolvidos (o shell para fazer o redirecionamento io, xargs e quatro ecos). Isso não é tão ruim nesse escopo, mas é mensuradamente mais lento com algumas centenas de linhas de saída.
Hildred 22/03/16
16

Muito 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
heemail
fonte
2

A resposta de heemayl é o caminho a seguir, no entanto, aqui está uma alternativa usando o Perl:

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

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

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

AWKaproximação. Alterando basicamente o separador de saída para campos e loop. O arquivo de teste é o seu exemplo colado várias vezes 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
Sergiy Kolodyazhnyy
fonte
1

Usando sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
techraf
fonte
Não quite..it gostaria de acrescentar um final de linha após cada linha (inicial) ..
heemayl
Verifique com várias linhas, você teria um caso claro então ..
heemayl
Você pode adicionar um exemplo com a sua resposta ..
heemayl
@heemayl Você quis dizer que isso transformaria espaços à direita em novas linhas. Sua sintaxe não facilita a compreensão. : /
techraf 21/03
1

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

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

Este comando executa o script Python 3 de uma linha 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 sysmódulo para ler os argumentos da linha de comando, pega o primeiro argumento fornecido como nome do arquivo para abrir e imprime cada pedaço 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
Byte Commander
fonte