Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中计算txt文件中不同单词的数量_Bash_Shell - Fatal编程技术网

在Bash中计算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 这个命令说: 转储文件名的内容 用单个空间替换多个空间 用换行

嗯,我对bash的编程不太了解,我是新手,所以我正在努力寻找一个代码来迭代一个txt文件中的所有行,并计算有多少单词是不同的。 示例:如果txt文件中有“诺莉是天主教徒,因为她母亲是天主教徒”

所以结果必须是7

肯定。我想你可以把“单词”定义为被空间隔开的东西吗?在这种情况下,请尝试以下操作:

cat filename | sed -r -e "s/[ ]+/ /g" -e "s/ /\n/g" | sort -u | wc -l
这个命令说:

  • 转储文件名的内容

  • 用单个空间替换多个空间

  • 用换行符替换空格

  • 对列表进行排序并“uniquify”

  • 打印出行数

根据评论,如果您愿意,您可以通过以下方式在技术上不使用cat:

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或进行其他更改,我认为
*
很好。那么,很公平