Вы можете настроить следующую командную строку с помощью «find» и «awk»
find FOLDERLIST -type f -iname "PATTERN" \
-exec awk -F":" 'NF>1 {print $2}' "{}" \; > /PATH/TO/RESULTFILE
где
РЕДАКТИРОВАТЬ :изменена проверка пустых результатов на NF>1, как было предложено steeldriver.
Попробуйте это,
awk '
BEGINFILE{fnum++; delete f;}
!f[$0]++{s[$0]++;}
END {for (l in s){if (s[l] == fnum) print l}}
' files*
Пояснение:
BEGINFILE {... }
Запускать в начале каждого файла
fnum++
увеличить счетчик файлов delete f
удалить массив , который используется для фильтрации повторяющихся строк в файле(см. ссылку на решение, совместимое с posix -). !f[$0]++ {... }
Выполнять только при первом появлении строки в файле (, если f[$0]
равно 0 (false))
s[$0]++
Строка приращения счетчика -. END {... }
Выполнить один раз в конце
for (l in s){if (s[l] == fnum) print l}
Зациклить строки и вывести каждую, где количество вхождений равно количеству файлов. Памяти должно хватить на 600 000 строк. В противном случае вы можете удалить из s
все, что меньше fnum
в блоке BEGINFILE{...}
.
С zsh
, используя его ${a:*b}
оператор пересечения массивов для массивов, помеченных уникальным флагом (, также используя $(<file)
оператор ksh и f
флаг раскрытия параметра для разделения на символы перевода строки):
#! /bin/zsh -
typeset -U all list
all=(${(f)"$(<${1?})"}); shift
for file do
list=(${(f)"$(<$file)"})
all=(${all:*list})
done
print -rC1 -- $all
(этот скрипт принимает в качестве аргументов список файлов; пустые строки игнорируются ).
Сjoin
:
cp a jnd
for f in a b c; do join jnd $f >j__; cp j__ jnd; done
У меня просто числа (1 -6, 3 -8, 5 -9 )в трех файлах a, b и c. Это две строки (, числа, строки ), которые имеют общее.
]# cat jnd
5
6
Это не элегантно/эффективно, особенно с этим cp
между ними. Но его можно легко заставить работать параллельно. Выберите подгруппу файлов (for f in a*
), дайте файлам уникальные имена, после чего вы сможете запускать несколько подгрупп одновременно. Вам все еще нужно объединить эти результаты... -с 64 файлами у вас будет 8 потоков, объединяющих по 8 файлов в каждом, а затем оставшиеся 8 объединенных файлов можно снова разделить на 4 потока.
Параллельная версия в bash. Это должно работать для файлов больше, чем память.
export LC_ALL=C
comm -12 \
<(comm -12 \
<(comm -12 \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 1) <(sort 2);) <(comm -12 <(sort 3) <(sort 4););) \
<(comm -12 <(comm -12 <(sort 5) <(sort 6);) <(comm -12 <(sort 7) <(sort 8);););) \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 9) <(sort 10);) <(comm -12 <(sort 11) <(sort 12););) \
<(comm -12 <(comm -12 <(sort 13) <(sort 14);) <(comm -12 <(sort 15) <(sort 16););););) \
<(comm -12 \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 17) <(sort 18);) <(comm -12 <(sort 19) <(sort 20););) \
<(comm -12 <(comm -12 <(sort 21) <(sort 22);) <(comm -12 <(sort 23) <(sort 24);););) \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 25) <(sort 26);) <(comm -12 <(sort 27) <(sort 28););) \
<(comm -12 <(comm -12 <(sort 29) <(sort 30);) <(comm -12 <(sort 31) <(sort 32);););););) \
<(comm -12 \
<(comm -12 \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 33) <(sort 34);) <(comm -12 <(sort 35) <(sort 36););) \
<(comm -12 <(comm -12 <(sort 37) <(sort 38);) <(comm -12 <(sort 39) <(sort 40);););) \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 41) <(sort 42);) <(comm -12 <(sort 43) <(sort 44););) \
<(comm -12 <(comm -12 <(sort 45) <(sort 46);) <(comm -12 <(sort 47) <(sort 48););););) \
<(comm -12 \
<(comm -12 \
<(comm -12 <(comm -12 <(sort 49) <(sort 50);) <(comm -12 <(sort 51) <(sort 52););) \
<(comm -12 <(comm -12 <(sort 53) <(sort 54);) <(comm -12 <(sort 55) <(sort 56);););) \
<(cat <(comm -12 <(comm -12 <(sort 57) <(sort 58);) <(comm -12 <(sort 59) <(sort 60););) ;);););
Замените sort
на cat
, если файлы уже отсортированы.