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.
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.
Respostas:
Usando tr, substitua cada caractere de espaço repetido ( ) por um único caractere de nova linha ( \n).
tr -s ' ' '\n'< infile > outfile
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.
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
grep
Você também pode usar o fmtcomando:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
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!
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
Usando um forloop:
for val in `cat file1` ; do echo $val >> file2; done;
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
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
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
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