Transformar linha de inteiro em saída de várias colunas

0

Estou tentando obter a entrada de um arquivo para gerar uma lista com linhas e colunas desses números na ordem de classificação. Isso será usado para gerar um documento imprimível mais tarde, para que eu possa substituir as etapas atualmente usadas manualmente no Excel.

Dados brutos são inteiros entre 1 e 20000. suponha que:

1 2 3 4 5 6 7 8 ...

ou

1
2
3
4
5

A lista é classificada por valor numérico e separada por espaços em branco. Opcionalmente, eu posso separar os valores por \ n ou qualquer outra coisa, se isso me ajudar a chegar ao meu objetivo

O valor da coluna deve ser 7, mas provavelmente eu poderei alterar isso depois.

Minha saída desejada:

1 40 80
2 41 81 
3 42 82 
4 43 83

O que eu tentei enquanto esperava descobrir algumas questões unix.se, outras sugestões sobre SF, manpage de column, fml etc.

for value in $(cat /tmp/list); do      printf "%-8s\n" "${value}"; done|column -x

saída (simplificada, caractere de tabulação entre):

1 2 3 4
5 6 7 8
...

A próxima tentativa foi uma sugestão no Serverfault:

cat /tmp/list |fmt |column -t

saída:

1    2    3    4    5 
6    7    8    9    10

Eu gostaria de entender onde meu problema com a compreensão durante o processo é, não apenas a solução bruta (que ajudaria embora).

    
por Dennis Nolte 11.08.2015 / 17:28

2 respostas

4
echo {1..20000} | tr " " "\n" | sort -n | pr -T3 -s" " -l 6667

Saída:

1 6668 13335
2 6669 13336
3 6670 13337
4 6671 13338
5 6672 13339
6 6673 13340
7 6674 13341
8 6675 13342
9 6676 13343
10 6677 13344
11 6678 13345
.
.
.

Para testar seu arquivo:

tr " " "\n" < file | sort -n | pr -T3 -s" " -l 6667

Não importa se os números 20000 são todos seguidos ou em uma coluna.

    
por 11.08.2015 / 19:06
0

Suponha que sua entrada consiste em números separados por novas linhas, como:

1
2
3
...

é uma questão de um simples script sed para colocá-los em colunas:

$ sed -n '{N;N;N;N;N;N;s/\n/\t/g;p}'

Quando o script encontra uma linha, ele lê mais 6 linhas ( N;N;N;N;N;N ) no buffer, substitui cada nova linha no buffer por uma guia ( s/\n/\t/g ) e imprime a saída do buffer ( p ). O resultado:

1    2    3    4    5    6    7
8    9    10   11   12   13   14
...

Observação: O número de linhas na entrada precisa ser um múltiplo de sete, todas as entradas restantes serão descartadas.

    
por 11.08.2015 / 18:30