Shell *for* перебирает файл и для каждой строки использует sed для удаления строк из другого файла

Это довольно просто и понятно. Имея больше потоков, чем поддерживает ваш процессор, вы фактически сериализуете, а не распараллеливаете. Чем больше у вас потоков, тем медленнее будет работать ваша система. Ваши результаты на самом деле являются доказательством этого явления.

-1
14.02.2020, 00:47
2 ответа

Если у вас есть два файла, один из которых содержит список строк для удаления из другого, вы можете сделать все это с помощью одного простого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и будет исключен из вывода.

1
28.04.2021, 23:23

Никогда не используйте букву 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менее эффективно, менее надежно и менее переносимо ).

1
28.04.2021, 23:23

Теги

Похожие вопросы