在Bash中计算txt文件中不同单词的数量
嗯,我对bash的编程不太了解,我是新手,所以我正在努力寻找一个代码来迭代一个txt文件中的所有行,并计算有多少单词是不同的。 示例:如果txt文件中有“诺莉是天主教徒,因为她母亲是天主教徒”在Bash中计算txt文件中不同单词的数量,bash,shell,Bash,Shell,嗯,我对bash的编程不太了解,我是新手,所以我正在努力寻找一个代码来迭代一个txt文件中的所有行,并计算有多少单词是不同的。 示例:如果txt文件中有“诺莉是天主教徒,因为她母亲是天主教徒” 所以结果必须是7肯定。我想你可以把“单词”定义为被空间隔开的东西吗?在这种情况下,请尝试以下操作: cat filename | sed -r -e "s/[ ]+/ /g" -e "s/ /\n/g" | sort -u | wc -l 这个命令说: 转储文件名的内容 用单个空间替换多个空间 用换行
所以结果必须是7肯定。我想你可以把“单词”定义为被空间隔开的东西吗?在这种情况下,请尝试以下操作:
cat filename | sed -r -e "s/[ ]+/ /g" -e "s/ /\n/g" | sort -u | wc -l
这个命令说:
- 转储文件名的内容
- 用单个空间替换多个空间
- 用换行符替换空格
- 对列表进行排序并“uniquify”
- 打印出行数
sed -r -e "s/[ ]+/ /g" -e "s/ /\n/g" filename | sort -u | wc -l
此外,从另一个注释中,您可以选择使用tr
(重要的是使用-s标志来处理重复的空格),而不是使用类似以下内容的sed
:
tr -s " " "\n" < filename | sort -u | wc -l
tr-s”““\n”
这个故事的寓意是,有几种方法可以完成这类事情,更不用说这里给出的其他完整答案:-)我个人最喜欢的答案是埃德·莫顿的,我相应地提高了投票率
cat yourfile.txt | xargs -n1 | sort | uniq -c > youroutputfile.txt
xargs-n1=每行放一个单词
排序
uniq-c=统计不同值的出现次数
我会这样做,并附上评论:
echo "Nory was a Catholic because her mother was a Catholic" |
# tr replace
# -s - squeeze
# -c - complementary
# [a-zA-Z0-9_] - all letters, number and underscore
# but complementary set, so all non letters, not numbers and not underscores.
# replace them by newline
tr -sc '[a-zA-Z0-9_]' '\n' |
# and sort unique and display count
sort -u | wc -l
经过测试
决定使用
[a-zA-Z0-9.]
,因为这是GNU sed与单词匹配的方式。您也可以将文本小写,以便不考虑大小写来比较单词
$ grep -o '[^[:space:]]*' file | sort -u | wc -l
7
还可以使用[:alnum:://code>字符类过滤单词,而不是仅对US-ASCII有效的[a-zA-Z0-9\]
,并且在希腊语或土耳其语中会显著失败
#/usr/bin/env bash
echo“uniq单词是至少出现一次的单词,无论大小写如何。”|
#将文本转换为小写
tr'[:上:'[:下:''|
#用换行符拆分字母数字
tr-sc'[:alnum:''''''\n'|
#单字排序
排序-u|
#计算唯一单词的行数
wc-l
祝贺您,您赢得了今天的“无用使用猫”奖:-)请尝试sed-r-e“s/[]+///g”-e“s//\n/g”filename | sort…
。很公平:pS'ok,它即使在这种琐碎的情况下也能工作,因此值得一次投票。sed-r-e“s/[]+//g”-e“s///\n/g”
与tr-s''.\n'
我删除了wc-l以查看它是如何工作的,我发现它工作的,但是一些相等的词没有被删除,因为它们是由制表符分隔的,就像这样:单词使用xargs
会很奇怪。例如quote:“这是一个quote”
可以计算2个单词xargs
解析引号。哦,奇怪,为什么它只算两个?在该命令的开头是否缺少一个cat
?另外,这不是给每个单词单独的数量而不是总的数量吗?在看到另一个答案后,我猜测了一下,然后删除了it@TravisG:除引号外,xargs
的另一个问题是它将标点符号作为单词的一部分。如果输入包含类似A+B,C
(不带空格)的内容,则这是xargs的一个输入字,而不是三个。一个解决方案是首先通过管道将输入通过tr
并用空格替换不是字母的所有内容,然后将其馈送到xargs
。为什么需要在那里使用sed?tr可以在替换非字母之前压缩非字母,以删除空行。例如,你好,我的名字是kamil。
将导致一个来自的空行,
被两个\n\n
echo你好,我的名字是kamil。|tr-cs[:alpha:]['\n'
不会生成空行..嗨@Ed Morton,我喜欢这个答案(我投了更高的票),但我认为用+
表示“一个或多个非空格”比用*
表示“零或多”要好。。。由于-o标志(我不在shell中测试),您的答案可能会处理这个问题,但我认为如果没有其他内容进行编辑,它在语义上会更正确。如果我使用+
而不是*
,那么我需要添加-E
以支持ERE或进行其他更改,我认为*
很好。那么,很公平