Linhas para conversão de coluna de arquivo


15

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


Se seu arquivo consistir em mais de uma linha e sua saída tiver, portanto, mais de uma coluna, tente este script AWK .
Pausado até novo aviso.

Respostas:


20

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

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

Mas acho que você quer algo assim?

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

Com awknós 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 e ENDimprime o resultado que seria a primeira linha na primeira coluna, a segunda linha na segunda coluna, etc. É claro que o arquivo de entrada está limitado ao tamanho da sua memória.


Eu tentei com os mesmos dados e código, ele imprimiu a última coluna como primeiro registro como 4 d% e, em seguida, o segundo registro 1 a # e assim por diante.
Abhinay

8

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

grep -oP '\S+' infile > outfile

OU

grep -o '[^[:space:]]\+' infile > outfile

1
+1 para uso criativo degrep
Volker Siegel

8

Você também pode usar o fmtcomando:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

7

Com o GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashparece ser a melhor ferramenta para a tarefa, mas fascinante quantas outras ferramentas podem ser usadas!
Mark Stewart

6

Você também pode fazer isso usando sed:

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

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


5

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

awk '{OFS=RS;$1=$1}1' file > file2

2

Usando um forloop:

for val in `cat file1` ; do echo $val >> file2; done;

0

Você também pode tentar usar sed

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

Observe que estou usando @como 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 .bak

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

0

Versão Python:

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

Este usos <redirecionamento em stdin de python de input.txte gravações output.txtusando >o redirecionamento. O liner em si lê todas as linhas de stdinuma lista de strings, onde todos os espaços são substituídos por novas linhas, e reconstruímos o texto inteiro usando a .join()função

Uma abordagem alternativa para evitar que vários espaços em série sejam substituídos por novas linhas é usar .split()para quebrar 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

0

Usando xargs, (roubado da resposta de souravc ):

xargs -n 1 < File1 > File2

Ou, se alguma reformatação menor for necessária, use printfseqüências de caracteres de formato, conforme necessário:

xargs printf '%s\n' < File1 > File2

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

-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
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.