Это довольно просто и понятно. Имея больше потоков, чем поддерживает ваш процессор, вы фактически сериализуете, а не распараллеливаете. Чем больше у вас потоков, тем медленнее будет работать ваша система. Ваши результаты на самом деле являются доказательством этого явления.
Если у вас есть два файла, один из которых содержит список строк для удаления из другого, вы можете сделать все это с помощью одного простогоgrep
:
grep -v -f delete-these-lines.txt long-cluttered-filename.txt
Это выведет все строки из long-cluttered-filename.txt
, которые не соответствуют шаблонам из delete-these-lines.txt
.
Обратите внимание, что в случае, если какая-то строка в long-cluttered-filename.txt
будет содержать client
(, например.123superclient456
)он по-прежнему соответствует client
и будет исключен из вывода.
Никогда не используйте букву l
в качестве имени переменной, так как она слишком похожа на число 1
и таким образом запутывает ваш код. То, что вы хотите сделать, это плохая идея, как вы уже знаете, но см.https://mywiki.wooledge.org/DontReadLinesWithForо том, как читать строки из файла в оболочке, а затем вы напишете это как:
while IFS= read -r regexp; do
sed -i "/$regexp/d" long-cluttered-filename.txt
done < delete-these-lines.txt
но опять же -не делайте этого по всем причинам, о которых вас уже предупреждали (плюс вы просто -реализуете grep -v -f delete-these-lines.txt long-cluttered-filename.txt > tmp && mv tmp long-cluttered-filename.txt
менее эффективно, менее надежно и менее переносимо ).