Как указать путь с подстановочным знаком

Просто потому, что...

$ echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | gawk '{$1=$1} 1' FPAT=".{,3}" OFS="\n"
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄ
0
26.08.2020, 16:53
3 ответа

Ваш конвейер,

zcat /home/user/data/*/test_*.gz | sed -n '3p' > results

извлекает содержимое всех файлов, соответствующих шаблону, в один поток, а затем извлекает из него третью строку.

Чтобы получить третью строку каждого файла , вам придется перебрать их в цикле:

for pathname in /home/user/data/*/test_*.gz; do
    zcat "$pathname" | sed -n 3p
done >results

Это вызывает zcatи sedпо одному разу для каждого файла (, предполагая, что шаблон соответствует чему-то ).

1
18.03.2021, 23:09

Да, так как sedвидит только поток, отправленный zcat, который является соединением catнесжатого содержимого этих gzфайлов.

Вам нужно запустить по одному sedдля каждого файла здесь:

for file in /home/user/data/*/test_*.gz; do
  { zcat | sed '3!d;q'; } < "$file"
done > result

Здесь используется sed '3!d;q'для sedдля выхода после 3-й строки, чтобы zcatможно было прервать до того, как он завершит распаковку всего файла впустую.

{ a | b; } < fileгарантирует, что ни a, ни bне будут запущены, если fileне может быть открыт. В a < file | bзапуск aбудет пропущен, но не b. Вa file | b(для тех команд a, которые могут открывать файлы сами по себе ), и a, и bзапускаются независимо от того, можно ли открыть файл или нет.

С помощью zgrep, найденного по крайней мере в Debian, вы также можете сделать:

GREP=sed zgrep '3!d;q' /home/user/data/*/test_*.gz

zgrepесть сценарий оболочки, который на самом деле запускает zcat -f | $GREPдля своих аргументов (и добавляет имена файлов в начало, используя sed, если вы не используете параметр -h, хотя использование -hс GREP=sedздесь не будет не работает, так как опция передается в $GREP, а sedне поддерживает эту опцию ).

3
18.03.2021, 23:09

Выполняется командой find:

find path -type f -iname "*.gz" -exec bash -c "zcat {}|sed -n 'p'" \; >>results.txt
0
18.03.2021, 23:09

Теги

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