删除文件中出现次数少于 5 次的所有单词

删除文件中出现次数少于 5 次的所有单词

我有一个文本文件,每行都有一个字符串,例如:

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

这可能更容易使用sortuniq -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}'

相关内容