
Я пытаюсь сопоставить шаблон для определенного столбца в тысячах сжатых файлов на машине Linux, и на основе совпадения я хочу вывести имя файла, как это сделать. Нижеприведенные варианты не работают для меня, пожалуйста, какие-нибудь предложения. Спасибо
zgrep 12345 *| awk -F"^" '{if($8==12345) print}'
find . -type f |xargs zcat | awk -F"^" '{if($8==12345) print}'
решение1
Самое ясное/простое IMHO:
while IFS= read -r fname; do
zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)
но есть также возможность вывести имя файла из zgrep и прочитать его с помощью awk, что может быть более эффективно (но полагается на то, что имя файла не содержит никаких символов :
s):
zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'
Оба решения предполагают, что в именах файлов нет символов новой строки, а первое решение также предполагает отсутствие управляющих последовательностей, как \t
в именах файлов.