输出作为参数传递的所有文本文件中的总行数的脚本

输出作为参数传递的所有文本文件中的总行数的脚本

因此,我正在编写一个脚本,该脚本将接受文本文件的参数,并应输出这些文件中的总行数。例如,如果我说

./myScript file1 file2 file3

它会打印

10 total

(我们假设这三个文件中所有行的总和为 10)。

我知道如何回顾所有的争论。我还知道,要获取文件中的行数,我会说:

wc -l < fileName

然而,我怎样才能把它变成一个“int”,我可以将其添加到某种累积和中呢?

答案1

您只需使用cat管道即可实现您的目标:

cat "$@" | wc -l

如果您确实想手动求和,可以使用 awk 执行此操作:

for f in "$@"; do 
    wc -l < "$f"
done | awk '{ sum+=$1 } END { print sum }'

或者,如果您确实想解析 的最后一行wc,请删除字符串“total”:

wc -l "$@" | awk 'END { print $1 }'

答案2

以乔丹的答案为基础:

1. 通过单个实例传输所有数据wc -l

    如果 [“$#”-gt 0]
    然后
        猫——“$@”|厕所-l
    别的
        回声0
    
    或者
     
    猫 - / dev / null“$ @”|厕所-l
    
  • 用于-- "$@"防止以以下内容开头的文件名-
  • 避免cat不带参数调用,因为这会导致它读取标准输入。
  • 请注意,这 是可怕的经典形式cat a_single_file | something猫的无用使用,但 还可以(尽管仍然不理想)。cat one_or_more_file(s) | something

wc2.依靠发出“总”线的事实

    如果 [“$#”-gt 0]
    然后
        wc -l -- /dev/null "$@" | wc -l -- /dev/null "$@" |尾部-1
    别的
        回声 0 总计
    
    或者
     
    wc -l -- /dev/null /dev/null "$@" | wc -l -- /dev/null /dev/null "$@" |尾部-1
    
  • 请注意,仅当该行至少具有两个文件名参数时wc才会发出该行。total

3、用awk而不用wc

    如果 [“$#”-gt 0]
    然后
        awk 'END {print NR}' -- "$@"
    别的
        回声0
    
    或者
     
    awk 'END {print NR}' -- /dev/null "$@"
    

警告:

如果任何文件以换行符以外的字符结尾,则上述命令不会全部产生相同的答案。

答案3

sed -ne\$= files...

只需提供sed任意数量的文件名即可代替files...并且,当它读取完所有内容后,它将报告输入中最后=一个的行号。$

相关内容