Como transpor o eixo xey da tabela, usando comandos shell de cortar e colar

1

Eu preciso transpor o eixo xey, de um arquivo de 450.000 × 15.000 campos separados por tabulação, então eu tentei primeiro com um pequeno arquivo de teste 5 × 4 chamado A.txt:

x   column1 column2 column3

row1    0   1   2

row2    3   4   5

row3    6   7   8

row4    9   10  11

Eu tentei isso:

for i in {1..4}; do cut -f"$i" A.txt | paste -s; done > At.txt

mas não funciona bem.

A saída é:

X   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3
    2
    5
    8
    11
    
por Jose 08.08.2018 / 15:08

2 respostas

1

Seu comando funciona muito bem assumindo que a entrada é um arquivo de texto Unix com campos delimitados por tabulação, e que o GNU paste é usado. Em sistemas não-GNU, você teria que usar

$ for i in {1..4}; do cut -f"$i" A.txt | paste -s - ; done
x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
column3 2       5       8       11

Observe o argumento - para paste , que diz para ler a entrada padrão.

Você definitivamente não quer executar isso em colunas de 450k, já que isso exigiria a leitura do arquivo 450000 vezes. Seria melhor você usar outra solução para isso.

Veja, por exemplo, " Transpondo linhas e colunas ".

Se o comando acima for executado em um arquivo de texto do DOS, ele produzirá a seguinte saída no terminal:

x       row1    row2    row3    row4
column1 0       3       6       9
column2 1       4       7       10
        11

Redirecionar a saída para um novo arquivo e abrir esse arquivo no editor vim mostrará

x   row1    row2    row3    row4
column1 0   3   6   9
column2 1   4   7   10
column3^M   2^M 5^M 8^M 11^M

em que cada ^M é um caractere de retorno de carro (o caractere extra no final de uma linha de texto do DOS). Esses retornos de carro fazem o cursor voltar ao início da linha, e é por isso que a única coisa visível na última linha do terminal é uma guia e 11 (que sobrescreve as outras colunas).

Verifique se o seu arquivo de entrada é um arquivo de texto Unix executando dos2unix A.txt .

    
por 08.08.2018 / 15:27
1

O Cygwin é um ambiente Gnu. O problema são os términos de linha, os terminais de linha de dose MS-Windows são diferentes. Coloque o arquivo através dos2unix, primeiro (só faça isso para arquivos de texto).

Eu já reproduzi. Eu canalizo em od -ta , porque meu terminal o torna diferente para o dos dos cmd (cmd está mudando um retorno de carragen para um avanço de linha).

#unix2dos A.txt
#for i in {1..4}; do cut -f"$i" A.txt | paste -s; done | od -ta
0000000   x  ht   r   o   w   1  ht   r   o   w   2  ht   r   o   w   3
0000020  ht   r   o   w   4  nl   c   o   l   u   m   n   1  ht   0  ht
0000040   3  ht   6  ht   9  nl   c   o   l   u   m   n   2  ht   1  ht
0000060   4  ht   7  ht   1   0  nl   c   o   l   u   m   n   3  cr  ht
0000100   2  cr  ht   5  cr  ht   8  cr  ht   1   1  cr  nl

Explicação: cut está vendo o retorno da carruagem como parte do último campo. Newline é o delimitador de registro.

    
por 08.08.2018 / 16:34

Tags