Просто потому, что...
$ echo "ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ" | gawk '{$1=$1} 1' FPAT=".{,3}" OFS="\n"
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄĄ
ĄĄ
Ваш конвейер,
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
по одному разу для каждого файла (, предполагая, что шаблон соответствует чему-то ).
Да, так как 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
не поддерживает эту опцию ).
Выполняется командой find
:
find path -type f -iname "*.gz" -exec bash -c "zcat {}|sed -n 'p'" \; >>results.txt