Eu sei que você disse que queria se ater a aplicativos nativos, mas GNU Parallel permitiria que você executasse processos separados em paralelo, o que permitiria executar essa operação mais rapidamente:
sudo apt-get update
sudo apt-get install parallel
awk -F',' '{print $8}' file.csv | parallel -j+0 cdrtoip {}
Existem várias maneiras de invocar parallel
, mas o método acima tiraria a saída da 8ª coluna do arquivo .csv e executaria um cdrtoip
process por núcleo em seu sistema, em cada linha simultaneamente. Então, basicamente, se você estiver executando 4 núcleos, poderá concluir esse trabalho em 25% do tempo que normalmente levaria para executar.
O lado positivo de parallel
é que ele controla a saída e a gera em ordem, como se fosse apenas uma tarefa em execução.
Após a instalação, man parallel
para mais formas de execução (ou confira a documentação do link). Desculpe se isso não é o que você está procurando, mas veio para o resgate para mim inúmeras vezes no passado.
EDITAR: Se você quiser adicionar a saída de volta ao .csv para substituir a 8ª coluna, o exemplo abaixo funcionará , e tem
A configuração:
$ cat file.tmp
blah1,blah2,blah3,blah4,blah5,blah6,blah7,1175063050,blah9,blah10,blah11
$ for i in {1..5000}; do cat file.tmp; done > file.csv
$ wc -l < file.csv
5000
O script (usando o cdrtoip
que você forneceu):
$ cat csvjob.sh
#!/bin/bash
fragment1="$(cut -d, -f1-7 file.csv | tr ',' "\t")"
fragment2="$(cut -d, -f8 file.csv | parallel -j+0 cdrtoip {})"
fragment3="$(cut -d',' -f9- file.csv | tr ',' "\t")"
paste <(echo "$fragment1") <(echo "$fragment2") <(echo "$fragment3") | sed "s/\t/,/g" > newfile.csv
O resultado:
$ time ./csvjob.sh
real 3m23.092s
user 1m22.245s
sys 2m57.794s
$ head -3 newfile.csv
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
blah1,blah2,blah3,blah4,blah5,blah6,blah7,10.10.10.70,blah9,blah10,blah11
Outra edição: O seguinte foi executado em um Mac Mini quad-core (também executando outras coisas):
$ time ./csvjob.sh
real 2m12.171s
user 2m59.816s
sys 2m15.787s
Eu também percebi que você disse 500.000 linhas ao invés de 5.000 linhas. Por que vale a pena, veja as estatísticas abaixo para executar cdrtoip
5.000 vezes consecutivas:
$ time for i in {1..5000}; do cdrtoip 1175063050; done > /dev/null
real 2m32.487s
user 1m26.537s
sys 1m8.270s
Edição final:
O seguinte foi executado em um arquivo de 500.000 linhas em um Mac mini quad-core, que como declarado anteriormente, já estava executando vários aplicativos:
$ time ./csvjob.sh
real 216m22.780s
user 301m40.694s
sys 239m44.404s
Eu posso ver totalmente o que você quer dizer, OP.
Mesmo quando executado em paralelo, isso leva um bom tempo para ser executado.
Eu vejo que o OP encontrou uma solução melhor. 126 segundos por arquivo é difícil de bater. Novamente, para o que vale a pena, abaixo estão as estatísticas de executar o originalmente fornecido cdrtoip
com uma linha de 500.000 .csv usando parallel
(que eu percebo que o OP não é capaz de instalar) em uma VM Debian de 8 núcleos: / em>
$ time ./csvjob.sh
real 14m7.467s
user 6m3.883s
sys 4m18.556s