uma outra saída seria criar um arquivo com o conteúdo de cada linha e fazer o paste -d\; com eles, usaria bastante I/O mas pouco processamento e memória.
awk -F\; '{OFS="\n"; $1=$1; print $0 > NR}' arquivo paste -d\; [0-9] On Mon, May 25, 2009 at 03:40:58PM -0300, Flavio Junior wrote: > Fiz uma melhoria naquela ideia anterior... > > Da uma olhada, qualquer duvida pergunta ai: > > [r...@cerebro ~]# cat x > 1;2;3;4 > 5;6;7;8 > [r...@cerebro ~]# JMP=$(awk '{print $1/2}' <(tr ";" "\n" <x | wc -l)) > [r...@cerebro ~]# for ((i=1;i<=$JMP;i++)); do sed -n "${i}~${JMP}p" x2; done > | paste -d';' - - > 1;5 > 2;6 > 3;7 > 4;8 > [r...@cerebro ~]# > > Essa é pra qualquer tamanho de arquivo, mas vai executar NR/2 sed's. Sendo > NR o numero de linhas. > > -- > > Flávio do Carmo Júnior aka waKKu > > 2009/5/25 jimmy <ronaldo_...@yahoo.com.br> > > > > > > > On Mon, May 25, 2009 at 09:26:22AM -0300, Pedro Bazzarella da Silva wrote: > > > Amigos, > > > > > > Estou com uma dúvida: > > > > > > Tenho um arquivo com o seguinte layout: > > > 1;2;3;4 > > > 5;6;7;8 > > > > > > Eu gostaria de transformar o mesmo neste novo layout: > > > 1;5 > > > 2;6 > > > 3;7 > > > 4;8 > > > > > > A idéia é trocar linha por coluna. > > > > > > Existe algum comando no unix que faça isso direto? > > > > > > Abs, > > > > > > Pedro Bazzarella > > > ------------------------------------ > > > > se o seu arquivo for "pequeno" para o seu hardware, você pode tentar > > usar esse 1liner: > > > > awk -F\; > > '{for(i=1;i<=NF;i++){a[i,NR]=$i;}}END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++){ORS=(j==NR)?"\n":FS;print > > a[i,j];};}}' arquivo > > > > ele vai armazenar cada caractere em um array de 2 dimensões onde a > > posições e o número da linha formam o índice; ao final do processamento > > do arquivo, ele imprime o conteúdo do array. > > > > -- > > "Não manejo bem as palavras > > Mas manipulo bem as strings." > > ------------------------------ > ------------------------------------