Obrigado a vocês dois por suas respostas e obrigado Isaac pelos comentários.
Eu peguei todo o seu código e coloquei em um script stephen.awk
kusa.sh
e isaac.sh
depois disso eu executei um pequeno benchmark como este:
for i in $(ls *.csv)
do
script.sh $1
done
Com o comando time
eu os comparo e aqui estão os resultados:
stephen.awk
real 2m35,049s
user 2m26,278s
sys 0m8,495s
stephen.awk : atualizado com / IN_OPEN / antes do segundo bloco
real 0m35,749s
user 0m15,711s
sys 0m4,915s
kusa.sh
real 8m55,754s
user 8m48,924s
sys 0m21,307s
Atualizar com filtro em IN_OPEN
:
real 0m37,463s
user 0m9,340s
sys 0m4,778s
Nota:
Embora correto, eu tinha um monte de linhas em branco produzidas com sed
, seu script era o único assim.
isaac.sh
grep -oP '^[^;]*;\K[^;]*' file.csv | sort -u | grep -oP '.*/\K.*' | sort | uniq -d
real 7m2,715s
user 6m56,009s
sys 0m18,385s
com filtro em IN_OPEN
:
real 0m32,785s
user 0m8,775s
sys 0m4,202s
meu script
real 6m27,645s
user 6m13,742s
sys 0m20,570s
@ Stephen você claramente ganha este, com um impressionante decréscimo de tempo por um fator 2.5.
Embora depois de pensar um pouco mais eu tenha vindo com outra ideia, e se eu olhar apenas para o evento OPEN file isso reduziria a complexidade e você não deveria acessar um arquivo ou escrevê-lo sem primeiro abri-lo, então eu fiz isso:
#see I add grep "IN_OPEN" to reduce complexity
PATHLIST=$(grep "IN_OPEN" "${1}" | cut -d';' -f 2 | sort -u)
FILENAMELIST=""
for path in ${PATHLIST}
do
FILENAMELIST="$(basename "${path}")
${FILENAMELIST}"
done
echo "${FILENAMELIST}" | sort | uniq -d
Com essa única modificação que me deu o mesmo resultado, acabei com esse valor time
:
real 0m56,412s
user 0m27,439s
sys 0m9,928s
E tenho certeza que há muitas outras coisas que eu poderia fazer