Imprima cada linha várias vezes, mas diferentes

1

Eu tenho um arquivo enorme, ~ 4000000 linhas que se parecem com isso:

arquivo

:

1 
1 
2 
3 
2 
4 
...

basicamente, cada linha contém um número. Considerando este exemplo, gostaria de gerar um arquivo com a seguinte aparência:

newFile:

1 
1 
2 
2 
3 
3 
3 
2 
2 
4 
4 
4 
4 
....

Eu gostaria que cada linha fosse repetida n vezes quando n fosse o número armazenado na linha original.

Como eu mencionei, o arquivo é muito grande, então estou procurando a maneira mais rápida de fazer isso. Eu acho que atualmente, com o código que eu implementei o gargalo é o fato de que eu preciso reabrir o novo arquivo para escrever.

É assim que estou fazendo agora, mas é muito lento

while read i; do seq 1 ${i} | xargs -i -- echo $i >> newFile ;done < file

Muito obrigado.

    
por Sagi 25.08.2016 / 21:23

2 respostas

7

Em awk :

awk '{ for (i = 1; i <= $1; i++) { print $0 } }' file > newFile

Isso lerá o arquivo de entrada uma vez e gravará o arquivo de saída uma vez, nunca precisando reabrir nada.

    
por 25.08.2016 / 21:26
7

Em perl , usando o operador de repetição de sequência x :

$ perl -ne 'print $_ x $_' file
1
1
2
2
3
3
3
2
2
4
4
4
4
    
por 25.08.2016 / 21:28