У меня есть большой csv
файл, содержащий 60210 строк.Эти строки содержат хэши, пути и имена файлов, например:
hash | path | number | hash-2 | name
459asde2c6a221f6... | folder/..| 6 | 1a484efd6.. | file.txt
777abeef659a481f... | folder/..| 1 | 00ab89e6f.. | anotherfile.txt
....
Я фильтрую этот файл по списку хэшей, и для облегчения процесса фильтрации я создаю и использую сокращенную версию этогофайл, например, так:
hash | path
459asde2c6a221f6... | folder/..
777abeef659a481f... | folder/..
Отфильтрованный результат содержит все строки, которые имеют хэш, которого нет в моей справочной базе хеш-функций.
Но для правильного анализа отфильтрованногорезультат, мне нужны предыдущие данные, которые я удалил.Поэтому моя идея состояла в том, чтобы прочитать отфильтрованный файл результатов, найти поле hash
и записать его в расширенный файл результатов, который будет содержать все данные.
Для этого я использую цикл:
getRealNames() {
originalcontent="$( cat $originalfile)"
while IFS='' read -r line; do
hash=$( echo "$line" | cut -f 1 -d " " )
originalline=$( echo "$originalcontent" |grep "$hash" )
if [ ! -z "$originalline" ]; then
echo "$originalline" > "$resultenhanced"
fi
done < "$resultfile"
}
Но при реальном использовании он крайне неэффективен: для предыдущего файла этот цикл занимает примерно 3 часа для работы с 4Go RAM, системой Intel Centrino 2, и мне кажется, что это слишком долго для этоговид операции.
Можно ли как-нибудь улучшить эту операцию?