Спасибо вам обоим за ответы и спасибо Исааку за комментарии.
Я взял весь ваш код и поместил его в скриптstephen.awk
kusa.sh
и isaac.sh
, после чего я провел небольшой тест, подобный этому:
for i in $(ls *.csv)
do
script.sh $1
done
Командой time
сравниваю и вот результат:
stephen.awk
real 2m35,049s
user 2m26,278s
sys 0m8,495s
stephen.awk:обновлено /IN _OPEN/ перед вторым блоком
real 0m35,749s
user 0m15,711s
sys 0m4,915s
куса.ш
real 8m55,754s
user 8m48,924s
sys 0m21,307s
Обновление с включенным фильтромIN_OPEN
:
real 0m37,463s
user 0m9,340s
sys 0m4,778s
Примечание:
Хотя правильно, у меня было много пустых строк, выведенных с помощью sed
, ваш скрипт был единственным таким.
isaac.sh
grep -oP '^[^;]*;\K[^;]*' file.csv | sort -u | grep -oP '.*/\K.*' | sort | uniq -d
real 7m2,715s
user 6m56,009s
sys 0m18,385s
С включенным фильтромIN_OPEN
:
real 0m32,785s
user 0m8,775s
sys 0m4,202s
мой сценарий
real 6m27,645s
user 6m13,742s
sys 0m20,570s
@Stephen, вы явно выиграли, с очень впечатляющим сокращением времени в 2,5 раза.
Хотя, немного подумав, я пришел к другой идее: что, если я буду смотреть только на событие OPEN file, это уменьшит сложность, и вы не предполагаете получить доступ к файлу или записать его, не открыв его сначала, поэтому я так и сделал. что:
#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
С этой единственной модификацией, которая дала мне тот же результат, я получаю это time
значение:
real 0m56,412s
user 0m27,439s
sys 0m9,928s
И я уверен, что есть много других вещей, которые я мог бы сделать
Хотя зацикливание глобуса безопаснее, чем передача по конвейеру вывода ls
, имейте в виду, что вывод ls
настолько опасен, насколько вы его создаете. Если вы являетесь единственным пользователем системы и разумно относитесь к именованию файлов, то конвейер ls
не имеет большого значения. Как упоминается в вашей статье, эти проблемы возникают только тогда, когда вы начинаете добавлять в имена файлов нечетные символы (, символы новой строки, каналы и т. д. ). Я бы действительно беспокоился о безопасной передаче ls только при использовании системы, которая используется большой группой людей или имеет файлы, случайно сгенерированные какой-либо программой. Для общего использования на частном компьютере разумное именование файлов, вероятно, проще, чем написание цикла.