以空格分隔过滤出所有的单词并统计每个单词出现的次数
时间: 2023-08-22 10:08:01 浏览: 92
要以空格分隔并统计每个单词出现的次数,可以使用`awk`命令结合数组来实现。你可以尝试以下命令:
```shell
echo "your text" | awk '{for(i=1;i<=NF;i++) wordcount[$i]++} END {for(word in wordcount) print word, wordcount[word]}'
```
请将 "your text" 替换为你要统计的文本内容。这个命令会将文本按照空格分隔成单词,并使用数组 `wordcount` 记录每个单词出现的次数。最后,使用 `print` 命令打印出每个单词及其出现次数。
如果你希望从文件中读取文本进行统计,可以使用以下命令:
```shell
awk '{for(i=1;i<=NF;i++) wordcount[$i]++} END {for(word in wordcount) print word, wordcount[word]}' your_file.txt
```
将 `your_file.txt` 替换为你要统计的文件路径。这个命令会读取文件内容,并按照相同的方式进行单词统计。
相关问题
I am lizhenya teacher! I teach linux. test I like badminton ball ,billiard ball and chinese chess! my blog is http: blog.51cto.com our site is http:www.lizhenya.com my qq num is 593528156 #aaaa, #not 572891888887. ^^^^^^^^66$$$$$$$^^^$$ lizhenyalizhenyalizhenya 以空格分隔过滤出所有的单词并统计每个单词出现的次数
以下是以空格分隔并统计每个单词出现次数的结果:
```
I: 2
am: 1
lizhenya: 4
teacher!: 1
teach: 1
linux.: 1
test: 1
like: 1
badminton: 1
ball: 2
,billiard: 1
and: 1
chinese: 1
chess!: 1
my: 3
blog: 1
is: 2
http:: 2
blog.51cto.com: 1
our: 1
site: 1
http:www.lizhenya.com: 1
qq: 1
num: 1
593528156: 1
#aaaa,: 1
#not: 1
572891888887.: 1
^^^^^^^^66$$$$$$$^^^$$: 1
```
请注意,该结果区分大小写,并且会将标点符号作为单词的一部分进行统计。
你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。 输入格式: 输入在一行中给出一行文本,以.结束 提示:用scanf("%c",...);来读入一个字符,直到读到.为止。 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。 输入样例:
### 回答1:
这个问题要求编写一个读取一行文本的程序,在其中用空格分隔为若干个单词,每个单词的长度为若干个字符,以.结束。你需要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it's算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。
输入格式: 输入在一行中给出一行文本,以.结束。
输出格式: 在一行中按照输入的格式输出单词的长度,每个长度后面跟一个空格。行末不得有多余空格。
输入样例: This is a sample program that reads input.
输出样例:
4 2 1 6 7 5.
注意:实现输入时,请使用scanf("%c",...);来读入一个字符,直到读到。为止。
### 回答2:
本题考察的是字符串的扫描和处理技巧,在读入每一个字符时需要判断其是否为空格或者.,如果是则输出前一个单词的长度并将计数器清零,否则计数器加1。
具体实现时,可以用scanf("%c", &c)读入一个字符,同时用getchar()读掉多余的空格,直到遇到.为止。读入的字符依次存入一个字符数组中,然后扫描这个数组并统计长度即可。
具体代码如下:
```cpp
#include <stdio.h>
int main()
{
char c, s[1000];
int len = 0; // 单词长度计数器
// 读入文本,直到读到.
scanf("%c", &c);
while (c != '.') {
s[len++] = c;
scanf("%c", &c);
}
// 扫描字符串并输出每个单词的长度
for (int i = 0; i < len; i++) {
if (s[i] == ' ') {
printf("%d ", len - i - 1);
} else if (i == len - 1) {
printf("%d\n", len - i - 1);
}
}
return 0;
}
```
需要注意的细节有:
1. 在每次读入一个字符后,需要用getchar()读掉多余的空格,直到读到第一个非空格的字符。这是为了避免连续空格造成的额外计数。
2. 在输出最后一个单词长度时,需要用printf("%d\n", len - i - 1)输出换行符。
### 回答3:
本题需要读入一行文本,其中以空格分隔为若干个单词,以.结束。因此我们可以使用 scanf 来读入每个字符,并判断是否为 '.',如果是则结束读入。
读入的过程中,需要过滤连续的空格。如果遇到空格,则说明一个单词已经结束,可以输出它的长度并重新计数。如果遇到非空格字符,则将计数器加一。
最后需要注意的是,行末的 '.' 不计算在内,因此输出长度时要去掉它。可以使用一个布尔变量标记在读入到 '.' 后是否遇到过一个非空格字符,如果遇到了,则说明最后一个单词已经结束,可以直接输出它的长度。
完整代码如下:
```C++
#include <iostream>
using namespace std;
int main() {
int cnt = 0; // 当前单词长度计数器
bool last_non_blank = false; // 上一个字符是否为非空格字符的标记
char c; // 读入的字符
while (scanf("%c", &c) != EOF) { // 循环读入字符,直到遇到 EOF
if (c == '.') { // 如果读入到 '.',则结束读入
break;
} else if (c == ' ') { // 如果读入到空格
if (last_non_blank) { // 如果上一个字符是非空格字符,说明一个单词已经结束
cout << cnt << " "; // 输出单词长度
cnt = 0; // 重置计数器
last_non_blank = false; // 标记为已经遇到空格
}
} else { // 如果读入到非空格字符
cnt++; // 计数器加一
last_non_blank = true; // 标记为已经遇到非空格字符
}
}
if (last_non_blank) { // 最后一个单词还未输出(即遇到了最后一个非空格字符)
cout << cnt; // 直接输出最后一个单词的长度
}
return 0;
}
```
阅读全文