我试图在一个调用中解析shell脚本中的50多个文件,如下所示,
for i in {0..49} do _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" done eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}'
但是当我这样做时,我得到的文件名太长了' zcat出错。
我试图在一次通话中这样做的原因是因为据我所知,awk无法保留之前通话中的信息。我必须将整个列表视为一个整体(例如,在该列表中找到一个独特的单词)
我也不想合并文件,因为每个文件都是大文件。
有没有一种聪明的方法来解决这个问题,或者我是否需要拆分电话并写出中间结果?
答案 0 :(得分:4)
您可以直接从循环管道输入:
for date in "${_date_a[@]}"
do
zcat "$_srcdir01/$date.gz"
done | awk '{sum += 1} END {print sum;}'
在任何情况下,该代码都不应该将该错误视为已发布。
由于您的示例不完整或自包含,我添加了一些代码来初始化数据文件以进行测试:
$ cat testscript
_srcdir01="./././././././././././././././././././"
_date_a=(foo{0001..0050})
for file in "${_date_a[@]}"
do
echo "hello world" | gzip > "$file.gz"
done
for i in {0..49}
do
_file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz"
done
eval zcat "$_file_list" | awk '{sum += 1} END {print sum;}'
运行它会生成一堆测试数据,并正确地总计行数:
$ bash testscript
50
我可以重现您的问题,例如我删除eval
:
$ bash testscript
(...)/foo0045.gz ./././././././././././././././././././/foo0046.gz ././././././.
/././././././././././././/foo0047.gz ./././././././././././././././././././/foo0
048.gz ./././././././././././././././././././/foo0049.gz ./././././././././././.
/./././././././/foo0050.gz: file name too long
因此,请仔细检查您发布的代码是否是您运行的代码,而不是尝试解决的其他几项尝试之一。
答案 1 :(得分:-1)
$ awk '{sum += 1} END {print sum}' files...
可行,但您可能只需要使用wc -l
手动构建文件列表是不必要的,
$ zcat path/to/files{1..49} | awk ...
也可以。