Linhas para conversão de coluna de arquivo

14

Suponha que eu tenha um arquivo:

Arquivo1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

Arquivo2 eu quero:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

Linhas para conversão de coluna do Arquivo1.

    
por yisha 26.11.2014 / 06:12

11 respostas

14

Usando tr , substitua cada caractere de espaço repetido ( ) por um único caractere de nova linha ( \n ).

tr -s ' '  '\n'< infile > outfile

Mas eu acho que você quer algo assim?

1 2 3 4         1 a #
a b c d   -->   2 b $
# $ @ %         3 c @
                4 d %

Com awk , poderíamos fazer:

awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) } 
    END{ for (i in RtoC) print RtoC[i] }' infile

Isso une cada mesma posição de número arquivado em conjunto e em END imprime o resultado que seria a primeira linha na primeira coluna, segunda linha na segunda coluna, etc. É claro que o arquivo de entrada é limitado ao tamanho da sua memória. / p>     

por 26.11.2014 / 06:59
7

Você poderia simplesmente fazer isso através do grep. Por padrão grep, imprimiria a partida em uma nova linha separada.

grep -oP '\S+' infile > outfile

OR

grep -o '[^[:space:]]\+' infile > outfile
    
por 26.11.2014 / 07:18
7

Você também pode usar o comando fmt :

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
    
por 26.11.2014 / 08:42
7

Com o datamash do GNU :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
    
por 26.11.2014 / 19:55
6

Você também pode fazer isso usando sed :

$ sed -e 's/  */\n/g' file1 > file2

NOTA: Não manipula a situação em que as palavras contêm espaços.

    
por 26.11.2014 / 07:13
5

Usando awk , definindo o separador do campo de saída ( OFS ) como o separador de registro (linha) ( RS ):

awk '{OFS=RS;$1=$1}1' file > file2
    
por 26.11.2014 / 06:30
2

Usando um loop for :

for val in 'cat file1' ; do echo $val >> file2; done;
    
por 26.11.2014 / 07:55
0

Você também pode tentar usar sed

$ sed -i.bak s@' '@'\n'@g infile.txt

Por favor, note que eu estou usando @ como um separador para a operação de substituição. Isso também criará um arquivo de backup. Caso você não precise de um backup, remova o arquivo .bak

$ sed -i s@' '@'\n'@g infile.txt
    
por 16.01.2017 / 14:09
0

Versão em Python:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

Isso usa o redirecionamento < no stdin do python em input.txt e grava em output.txt usando o redirecionamento > . O one-liner em si lê em todas as linhas de stdin em uma lista de strings, onde todos os espaços são substituídos por newlines, e nós reconstruímos todo o texto usando a função .join() .

A abordagem alternativa para evitar vários espaços em série sendo substituídos por novas linhas é usar .split() para dividir a linha na lista de palavras. Dessa forma, podemos garantir que cada palavra seja separada apenas por uma nova linha

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
    
por 16.01.2017 / 14:46
0

Usando xargs , (roubado da resposta do souravc ):

xargs -n 1 < File1 > File2

Ou se qualquer reformatação menor for necessária, use as sequências de formatação printf , no entanto, se necessário:

xargs printf '%s\n' < File1 > File2
    
por 09.04.2018 / 21:03
0

Minha solução seria:

#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done
    
por 20.06.2018 / 23:31