5

我试图仅使用 wc 获取文件中的单词数。wc -w file.txt给我加上文件名。我不想要文件名。所以,我看到了它的wc -w < file.txt工作原理。

我不明白这个命令是如何工作的。我什至无法在看到此命令的答案下方添加评论。

为什么在 的情况下不打印文件名wc -w < file.txt

4

3 回答 3

5

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

42 myfile.txt

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

wc -w <myfile.txt

或者:

cat myfile.txt | wc -w

尽管后者在这种情况下效率低下,并且在输入比某些文件的内容更复杂的情况下效果更好。

不知道文件名的原因shell打开文件并将其附加到进程的标准输入。shell 也从不将传递给程序的命令行参数。许多程序都有这样的代码:wcwc -w <myfile.txtwc<myfile.txtwcwc

FILE * infile;
if (argc == 0)
    infile = stdin;
else
    infile = fopen (argv[1]], "r");

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

于 2013-08-05T21:55:56.923 回答
4

这是有效的,因为当您使用<shell 时,会将“file.txt”的内容获取到wc.

另外,请注意,这wc -l将为您提供file.txt. 如果你真的想要单词的数量而不管它们在哪一行,你应该wc -w改用。

当您使用wc -w file.txt它时,它会为您提供“file.txt”中的字数和文件名,因为wc它接受许多文件作为可能的输入,因此它会在字数之后输出文件名,以便您知道文件有那么多字。例如,假设您有这两个文件及其各自的内容:

双字.txt:foo bar

三字.txt:foo bar test

那么wc -w twoword.txt threeword.txt会给你:

2 twoword.txt
3 threeword.txt
5 total

从而显示每个文件中有多少个单词,然后将它们加起来。

于 2013-08-05T21:49:42.650 回答
3

在您的示例中, file.txt 被发送到标准输入。在这里阅读什么 stdin、stout 和 stderr:对 stdin、stdout 和 stderr 感到困惑

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

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

于 2013-08-05T21:51:41.550 回答