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?

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

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

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

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

1

Usando sed:

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.