首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash Uniq选项

Bash Uniq选项
EN

Stack Overflow用户
提问于 2018-01-02 00:49:35
回答 2查看 165关注 0票数 1

我有20个文件。在每个文件中,我都列出了出现的单词及其频率。

示例:

代码语言:javascript
复制
 2 représentant 
 3 reproduire 
 2 réseau 
 1 rester 
 3 reste 
 1 résumer 

我使用这个命令在这20个文件之间合并

代码语言:javascript
复制
cat *.txt > tous.txt | sort | uniq -ci  | sort -k3

其结果是,例如:

代码语言:javascript
复制
2  2 représentant 
1  6 représentant 
5  3 reproduire
2  3 reproduire  
6  3 réseau
1  1 réseau
etc..

但是我想要的是让它计算出每个单词的出现次数,而不需要写很多次。我想要的是:

代码语言:javascript
复制
8 representant
6 reproduire
4 réseau
... 

我可以用awk:

代码语言:javascript
复制
awk '{tab[$2]+=$1} END {for(i in tab){printf("%7d %s\n", tab[i], i) | "sort -k2"}}' ~/Bureau/Projet/data/dico/*.dico.forme.txt > ~/Bureau/Projet/data/input/black.txt

还有其他建议用在前中频吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-02 04:03:15

最简单的方法是一开始就不做计数。使用uniq似乎没有简单的方法,但是您可以使用Awk或循环来计算它。

  1. 合并所有数据(假设空格分隔) 猫*.txt >all.txt cat all.txt 2 hi 2测试3尝试3 hi 5测试3尝试
  2. 再数 与Awk: 排序-k2,2 all.txt \ awk‘{$2 += $1} {for (i in a)打印ai,i}’ 输出:5 hi 7测试6试

..。或者您可以使用一个while循环(效率较低)来完成它:

代码语言:javascript
复制
while read -r a; do
    echo "$(grep -w "$a" all.txt|cut -d ' ' -f1|paste -sd+|bc)" "$a"
done< <(cut -d ' ' -f2 all.txt|sort -u)

或者扭转uniq -c的做法:

代码语言:javascript
复制
while read -r a b; do
    yes "$b" |head -n "$a"
done <all.txt | sort| uniq -c
票数 1
EN

Stack Overflow用户

发布于 2018-01-02 10:57:46

不需要在tous.txt中存储中间结果,也不需要将整个数组保存在内存中,尽管这是一个小的效率攻击,除非您的数据集很大,否则不会有太大的区别。

代码语言:javascript
复制
sort -k2,2 *.txt |
awk 'NR>1 && $2 != prev { print sum, prev; sum = 0 }
    { prev = $2; sum += $1 }
    END { print sum, prev }'

注意END块是如何重复(部分)主流的。(缺少最后一个输出行是这种通用方法的常见错误。)

正如其他人已经建议的那样,如果您可以避免使用*.txt文件,直接使用整个原始输入到sort | uniq -c,那么最终可能会更加优雅和高效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48054449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档