2016-12-05 66 views
1

我试图解析50+在shell脚本文件中类似下面的单呼,如何获得过去的文件长度限制?

 
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无法保留以前调用的信息。我必须仔细考虑整个列表(例如在该列表中查找唯一的单词)

我也不想合并文件,因为它们都是大文件。

是否有一个聪明的方法来解决这个问题?还是我需要拆分调用并写出中间结果?

回答

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 

所以,请仔细检查您发布的代码是你运行代码,你在试图解决它使其他的几次尝试没有之一。

+0

如果您删除'eval',它会将整个事件作为* single * filename而不是多个。 – o11c

+0

您可以用'awk'END {print NR}'替换'awk'{sum + = 1} END {print sum;}''或者甚至更好的替换'wc -l'。 –

+0

我的歉意。我确实有解决方案工作..但我喜欢循环解决方案中的zcat,因为它更干净。我没有看到任何最终结果的差异,但是在'$ list_of_files“ do zcat文件 done'和'zcat long_long_list_of files'中的文件之间是否存在背景行为差异? – dorachan2010

-1
$ awk '{sum += 1} END {print sum}' files... 

会工作,但也许你只需要使用wc -l

手动建立文件列表是不必要的,

$ zcat path/to/files{1..49} | awk ... 

也能发挥作用。

+0

这显然是一个很小的例子。 'awk'不能直接在压缩文件上运行。 – o11c