这实际上相当棘手。
我基于GNU coreutils版本的wc
命令。请注意,total
行通常是最后打印的,而不是第一行(请参见我的问题评论)。
wc -l
为每个输入文件打印一行,其中包括文件中的行数和文件名。(如果没有文件名参数,则省略文件名;在这种情况下,它计算stdin中的行数。)
仅当有多个文件名参数时,它会打印一个包含总行数和单词total
的最终行。文档未说明任何禁止该摘要行的方法。
除了它是在其他输出之前之外,该行与名称恰好为total
的文件的输出无法区分。
因此,要可靠地过滤掉total
行,您必须读取wc -l
的所有输出,并仅在输出的总长度大于1时删除最后一行。(即使如此,如果您有带有换行符的文件名,这也可能会失败,但您可能可以忽略该可能性。)
一种更可靠的方法是对每个文件单独调用wc -l
,避免出现total
行:
for file in $directory-path/*.txt ; do wc -l "$file" ; done
如果你想对输出进行排序(这是你在评论中提到但未在问题中提到的内容):
for file in $directory-path/*.txt ; do wc -l "$file" ; done | sort -rn
如果你知道没有名为
total
的文件,一个快速而简单的方法是:
wc -l $directory-path/*.txt | grep -v ' total$'
如果你想在所有文件上运行
wc -l
命令并过滤掉
total
行,这里有一个bash脚本可以完成这项工作。根据需要调整
*.txt
。
#!/bin/bash
wc -l *.txt > .wc.out
lines=$(wc -l < .wc.out)
if [[ lines -eq 1 ]] ; then
cat .wc.out
else
(( lines-- ))
head -n $lines .wc.out
fi
rm .wc.out
另一个选项是这个Perl单行命令:
wc -l *.txt | perl -e '@lines = <>; pop @lines if scalar @lines > 1; print @lines'
@lines = <>
将所有输入读入一个字符串数组中。pop @lines
如果有多个,即最后一行是total
行,则丢弃最后一行。
wc
的man
页面没有提到这样的功能。你可以编写一个脚本(或者可能使用管道和awk
)来改变输出的外观。 - user554546tail +2
以跳过第一行。 - Barmartotal
行。至少在我的系统上,total
行是在最后打印的——正如POSIX明确要求的那样。ipo:你真的会得到你展示的输出吗?它会在顶部显示10 total
行吗? - Keith Thompson$directory-path
不是一个有效的变量名。 - Keith Thompson