我有一个文本文件,每行都有一个字符串,例如:
zanzibar
apple
banana
apple
carrot
banana
sausage
apple
apricot
tea
apple
apple
我正在尝试读取该文件,计算每个单词的数量,然后删除计数小于 5 的单词。出现超过 5 次的单词将仅出现一次。
对于上述内容,新文件应具有
apple
因为它在文件中出现超过 5 次。
到目前为止我尝试的是第一步 -> 删除出现次数少于 5 次的字符串,但即使这样似乎也不起作用。新文件保持为空。
awk -F'\n' '
FNR==NR{ seen[tolower($1)]++; next }
seen[tolower($1)]
seen[tolower($1)]<5{ delete seen[tolower($1)] }
' all.txt 5-or-more.txt
更新:
我正在运行以下命令:
awk '{ a[tolower($1)]++ }
END{
for(word in a){
if(a[word]>5){ print word }
}
}' all.txt > sorted.txt
答案1
你不想要-F'\n'
。这会将字段分隔符设置为换行符,并且永远不会做任何有用的事情,因为记录分隔符保持不变,而且也是\n
.
你所需要的就是这样的:
$ awk '{ a[tolower($1)]++ }
END{
for(word in a){
if(a[word]>=5){ print word }
}
}' file
apple
这会将每个单词 ( $1
) 保存为数组中的键a
,每次看到该单词时都会递增其值。然后,在文件末尾,我们迭代a
并打印 in 值a
大于或等于 5 的任何单词。
答案2
任务看起来很平常。
awk '++A[$0] == 5' file1 >file2
也许== 6
肯定是5次以上,打印1次。
答案3
这可能更容易使用sort
和uniq -c
计数。
$ sort --ignore-case all.txt |
uniq -c --ignore-case |
awk '$1 >= 5 {print $2}'
apple
答案4
datamash
这可以通过和 来完成awk
。
$ datamash -i -sW -g 1 count 1 <file | awk '$2 >= 5 {print $1}'