【问题标题】:piping files in unix for "wc" while retaining filename在unix中为“wc”管道文件,同时保留文件名
【发布时间】:2011-12-09 04:22:22
【问题描述】:

我有一堆myfile[somenumber] 形式的文件位于嵌套目录中。

我想为每个文件生成一个行数,并将该行数输出到一个文件。

这些文件是二进制文件,因此必须通过附加脚本open_file 进行管道传输,然后才能被“wc”计数。我愿意:

ls ~/mydir/*/*/other_dir/myfile* | while read x; do open_file $x | wc -l; done > stats

这可行,但问题是它将行数输出到文件stats 而不说出原始文件名。例如,它输出:

100
150

代替:

/mydir/...pathhere.../myfile1: 100
/mydir/...pathhere.../myfile2: 150

第二个问题:

如果我想将wc -l 的数量除以一个常数,例如在将其输出到文件之前将其除以 4?

我知道行数是 4 的倍数,所以结果应该是整数。不知道如何从上面的脚本中做到这一点。

我怎样才能让它把原始文件名和wc -l 结果放在输出文件中?

谢谢。

【问题讨论】:

    标签: bash unix scripting pipe


    【解决方案1】:

    您可以在计算行数之前输出文件名: echo -n "$x: " ; open_file $x | wc -lecho-n 参数省略了输出中的尾随换行符。

    要对整数进行除法,可以使用expr,例如expr $(open_file $x | wc -l) / 4

    因此,完整的 while 循环如下所示:

    while read x; do echo -n "$x: " ; expr $(open_file $x | wc -l) / 4 ; done
    

    【讨论】:

      【解决方案2】:

      试试这个:

      while read x; do echo -n "$x: " ; s=$(open_file $x | wc -l); echo $(($s / 4));
      

      当您到达wc(1) 时,您已经丢弃了文件名——它所看到的只是pipe(7)——但您可以在打开文件之前自己回显文件名.如果open_file 失败,这会给你留下一个丑陋的输出文件,但它可能是一个合适的权衡。

      $((...)) 使用 bash(1) 算术扩展。它可能不适用于您的 shell。

      【讨论】:

        猜你喜欢
        • 2015-06-18
        • 1970-01-01
        • 2018-04-06
        • 2010-10-28
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-30
        • 2023-03-29
        相关资源
        最近更新 更多