我的路径包含
/home/user/data/foo/test_foo.gz
/home/user/data/bar/test_bar.gz
/home/user/data/fub/test_fub.gz
and so on...
我正在尝试打印所有 .gz 文件的第三行
zcat /home/user/data/*/test_*.gz | sed -n '3p' > results
但这只显示了第三行test_foo.gz
答案1
是的,因为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'
forsed
在第三行之后退出,因此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
有一个 shell 脚本实际上在其参数上运行(并且除非您使用该选项,否则zcat -f | $GREP
会在文件名前面加上 using ,尽管在此处使用with不起作用,因为该选项被传递到并且不支持该选项)。sed
-h
-h
GREP=sed
$GREP
sed
答案2
您的管道,
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
andsed
一次(假设模式与某些内容匹配)。
答案3
使用命令完成find
:
find path -type f -iname "*.gz" -exec bash -c "zcat {}|sed -n 'p'" \; >>results.txt