【问题标题】:How can I get past file length limit?我怎样才能超过文件长度限制?
【发布时间】:2017-04-20 04:37:00
【问题描述】:

我正在尝试在一次调用中解析 50 多个 shell 脚本中的文件,如下所示,

对于我在 {0..49} 做 _file_list="$_file_list $_srcdir01/${_date_a[$i]}.gz" 完毕 评估 zcat "$_file_list" | awk '{sum += 1} END {打印总和;}'

但是当我这样做时,我得到 zcat 的“文件名太长”错误。

我尝试在单个调用中执行此操作的原因是,据我所知,awk 无法保留先前调用的信息。而且我必须将整个列表作为一个整体来考虑(例如,在该列表中找到一个唯一的单词)

我也不想合并文件,因为每个文件都已经是大文件了。

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

【问题讨论】:

    标签: linux file awk filenames


    【解决方案1】:

    您可以直接从循环管道:

    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
    

    因此,请仔细检查您发布的代码是您运行的代码,而不是您在尝试解决问题时所做的其他几次尝试之一。

    【讨论】:

    • 如果你删除eval,它会将整个内容作为单个文件名而不是多个文件名传递。
    • 您可以将awk '{sum += 1} END {print sum;}' 替换为awk 'END{print NR}' 或者更好的是wc -l
    • 我很抱歉。我确实有有效的解决方案。但我确实喜欢循环解决方案中的 zcat,因为它更干净。我没有看到任何最终结果差异,但 for file in "$list_of_files" do zcat file donezcat long_long_list_of files 之间的背景行为是否存在差异?
    • @dorachan2010 什么是后台行为?
    【解决方案2】:
    $ awk '{sum += 1} END {print sum}' files...
    

    可以,但也许你只需要使用wc -l

    不需要手动建立文件列表,

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

    也可以。

    【讨论】:

    • 这显然是一个最小的例子。而awk不能直接对压缩文件进行操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多