Recorte e transponha algumas linhas de um arquivo

2

Eu tenho 1344 linhas de coluna de dados. Eu quero formar 32 linha por 42 colunas do meu arquivo de dados de entrada. Quero cortar a primeira linha 42 e colar em uma coluna de 42 dados da coluna e continuar do mesmo modo. Meus dados estão organizados como

nome do arquivo: data.txt

1
2
3
.
.
.
1344

Eu quero que o resultado seja output.txt

1 2 3 ....42
43 44      84
.
.
.
1303 1304 . . . 1344

Eu quero que você me ajude com um script que possa fazer isso.

    
por AiB 01.01.2014 / 18:43

5 respostas

3

Isso deve funcionar:

awk '{if(n==41){n=0;print $0}else{printf "%s ",$0;n++}}' data.txt 

ou

awk '{if(NR % 42 == 0){print;}else{printf "%s ",$0}}' data.txt

ou

perl -ne 'if($. % 42){chomp; print "$_ "}else{ print;}' data.txt 

ou

perl -pne 's/\n/ / if $. % 42' data.txt
    
por 01.01.2014 / 19:05
2

A maneira mais fácil é usar o comando rs - se estiver disponível:

cat original.file | rs 32 42 > reshaped.file
    
por 02.01.2014 / 09:28
1

Que tal isso:

COUNT=0
while read data
do
  echo -n "${data} "
  let COUNT=${COUNT}+1;
  if (( ${COUNT} % 42  == 0 ))
  then
    echo ""
  fi
done < data.txt
    
por 01.01.2014 / 19:12
1

Se você pudesse usar python, numpy é bastante adequado para isso. Supondo que um arquivo x.txt contenha os dados, você poderia fazer algo como:

#!/usr/bin/env python
import numpy as np

a=np.loadtxt('x.txt', dtype='int') # load array from file x.txt into variable a
print a
b=a.reshape(32,42) # reshape array to desired shape
print b
c=a.T # Do a transpose if required
print c
    
por 01.01.2014 / 19:26
1

Usando colar

Só porque gosto muito de usar paste , você pode fazer isso com paste , embora não seja bonito:

Dados de amostra

$ seq 100 > data.txt

Exemplo

$ paste -d " " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < data.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100     

Se você precisar controlar o número de colunas, adicione / remova a quantidade correspondente de traços de paste .

Você pode usar a fantasia e usar um loop para controlar a geração dos traços para paste da seguinte forma:

$ paste -d " " $(for i in $(seq 42); do echo "- ";done) < data.txt 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100    

Mais aprimoramentos podem ser feitos no loop. Em vez de usar seq , podemos usar as conchas de contraventamento da expansão {#...#} .

$ paste -d " " $(for i in {1..42}; do echo "- ";done) < data.txt

Usando xargs

Outro método menos óbvio seria fazer com que xargs controlasse o número de caracteres através de sua -n # switch.

$ seq 100 | xargs -n 42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Assim, poderíamos aproveitar esse método da seguinte forma:

$ xargs -n 42 < data.txt 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Esses métodos só funcionarão quando os dados com os quais estamos lidando forem delimitados por espaço. Também digno de nota com o método xargs , este é por padrão, apenas ecoando os argumentos, mas ele pode ser modificado para que possa executar uma ação para cada um dos argumentos também.

    
por 01.01.2014 / 19:35