使用wc时,文件名打印两次

时间:2012-05-30 14:12:55

标签: linux shell wc

要打印当前文件夹的所有“.txt”文件中的行数,我使用以下脚本:

for f in *.txt;
do l="$(wc -l "$f")";
echo "$f" has "$l" lines;
done 

但是在输出中我得到了:

lol.txt has 2 lol.txt lines

为什么lol.txt打印两次(特别是在2之后)?我想有一些流刷新需要,但我不知道在这种情况下如何实现。所以我应该在脚本中做出什么改变以获得输出:

lol.txt has 2 lines

4 个答案:

答案 0 :(得分:1)

文件名被打印两次,因为wc -l "$f"也会在行数之后打印文件名。尝试将其更改为cat "$f" | wc -l

答案 1 :(得分:1)

wc打印文件名,因此您可以将脚本编写为:

ls *.txt | while read f; do wc -l "$f"; done

或者,如果您真的想要详细输出,请尝试

ls *.txt | while read f; do wc -l "$f" | awk '{print $2, "has", $1, "lines"}'; done

答案 2 :(得分:1)

您可以使用'cut'删除文件名:

for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done 

答案 3 :(得分:1)

这里有一个技巧。获取wc读取stdin,它不会打印文件名:

for f in *.txt; do
    l=$(wc -l < "$f")
    echo "$f" has "$l" lines
done