因此,我正在编写一个脚本,该脚本将接受文本文件的参数,并应输出这些文件中的总行数。例如,如果我说
./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
wc
2.依靠发出“总”线的事实
如果 [“$#”-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...
并且,当它读取完所有内容后,它将报告输入中最后=
一个的行号。$