“wc -w< file.txt”如何工作?

时间:2013-08-05 21:47:07

标签: linux unix wc

我试图只使用wc获取文件中的单词数。 wc -w file.txt给了我加上文件名。我不想要文件名。所以,我看到wc -w < file.txt有效。

我不明白这个命令是如何工作的。我甚至无法在the answer where I saw this command下面添加评论。

为什么在wc -w < file.txt

的情况下不打印文件名

3 个答案:

答案 0 :(得分:4)

这是有效的,因为当您使用<时,shell会将“file.txt”的内容提供给wc的标准输入。

另请注意,wc -l会为您提供file.txt中的行数。如果您真的想要单词的数量而不管它们在哪一行,您应该使用wc -w代替。

当你使用wc -w file.txt时,它会给你“file.txt”里面的单词数和文件名,因为wc接受许多文件作为可能的输入,所以它输出了字数后的文件名你知道那个文件有那么多单词。例如,假设您有这两个文件及其各自的内容:

twoword.txt:foo bar

threeword.txt:foo bar test

然后wc -w twoword.txt threeword.txt会给你:

2 twoword.txt
3 threeword.txt
5 total

因此显示每个文件中有多少个单词,然后将它们总计为总数。

答案 1 :(得分:4)

wc -w将输出每个参数的单词count和文件名。所以命令wc -w myfile.txt会给你类似的东西:

42 myfile.txt

但是,如果wc 知道文件名,则只输出计数。您可以使用输入重定向隐藏文件名,因为wc是在没有明确命名文件的情况下将读取标准输入的命令之一。这可以通过以下方式完成:

wc -w <myfile.txt

或:

cat myfile.txt | wc -w

虽然后者在这种情况下效率低,而且输入比某些文件的内容更复杂。

wc wc -w <myfile.txt不知道wc中的文件名的原因是因为 shell 打开文件并将其附加到<myfile.txt进程的标准输入。 shell也永远不会将wc传递给wc程序的命令行参数。像FILE * infile; if (argc == 0) infile = stdin; else infile = fopen (argv[1]], "r"); 这样的许多程序都有以下代码:

{{1}}

选择标准输入或打开已知文件名。在前一种情况下,该计划没有可用的名称。

答案 2 :(得分:3)

在您的示例中,file.txt正被发送到stdin。阅读stdin,stout和stderr在这里的内容:Confused about stdin, stdout, and stderr

wc的手册页定义了没有文件参数的行为。

wc正在从标准输入读取file.txt的内容并打印单词数。它不打印文件名,因为它从stdin读取时不知道文件名是什么。