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 awk
nó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 END
imprime 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 fmt
comando:
~$ 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
datamash
parece 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 for
loop:
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.txt
e gravações output.txt
usando >
o redirecionamento. O liner em si lê todas as linhas de stdin
uma 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 printf
seqüê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