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.
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.
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.
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
Tags large-files