0

为了打印当前文件夹的所有“.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

4 回答 4

1

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

于 2012-05-30T14:14:52.663 回答
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
于 2012-05-30T14:19:53.867 回答
1

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

for f in *.txt;
do l="$(wc -l "$f" | cut -f1 -d' ')";
echo "$f" has "$l" lines;
done 
于 2012-05-30T14:27:09.247 回答
1

这里有个窍门。让 wc 读取标准输入,它不会打印文件名:

for f in *.txt; do
    l=$(wc -l < "$f")
    echo "$f" has "$l" lines
done
于 2012-05-30T22:34:40.067 回答