Подходы 1 и 3 расширяют список файлов в командной строке оболочки.Это не будет работать с огромным количеством файлов.Подходы 1 и 3 также не работают, если файлы распределены по многим каталогам (что, вероятно, с миллионами файлов).
Подход 2 делает копию всех данных, поэтому он также неэффективен.
Вы должны использовать find
и передавать имена файлов непосредственно в egrep
.Используйте параметр -h
, чтобы подавить префикс с именем файла:
find . -name \*.txt -print0 \
| xargs -0 egrep -i -v -h 'pattern1|...|pattern8' \
| awk '{gsub(/"\t",",")}1' > all_in_1.out
xargs
автоматически запустит несколько процессов egrep
в последовательности, чтобы избежать превышения лимита командной строки в одном вызове.
В зависимости от содержимого файла также может быть более эффективным избегать процессов egrep
в целом и выполнять фильтрацию непосредственно в awk
:
find . -name \*.txt -print0 \
| xargs -0 awk 'BEGIN { IGNORECASE = 1 } ! /pattern1|...|pattern8/ {gsub(/"\t",",")}1' > all_in_1.out
BEGIN { IGNORECASE = 1 }
соответствуетопция -i
, равная egrep
, и !
инвертирует смысл сопоставления, как и -v
.IGNORECASE
представляется расширением GNU.