我有20个文件。在每个文件中,我都列出了出现的单词及其频率。
示例:
2 représentant
3 reproduire
2 réseau
1 rester
3 reste
1 résumer 我使用这个命令在这20个文件之间合并
cat *.txt > tous.txt | sort | uniq -ci | sort -k3其结果是,例如:
2 2 représentant
1 6 représentant
5 3 reproduire
2 3 reproduire
6 3 réseau
1 1 réseau
etc..但是我想要的是让它计算出每个单词的出现次数,而不需要写很多次。我想要的是:
8 representant
6 reproduire
4 réseau
... 我可以用awk:
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还有其他建议用在前中频吗?
发布于 2018-01-02 04:03:15
最简单的方法是一开始就不做计数。使用uniq似乎没有简单的方法,但是您可以使用Awk或循环来计算它。
..。或者您可以使用一个while循环(效率较低)来完成它:
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的做法:
while read -r a b; do
yes "$b" |head -n "$a"
done <all.txt | sort| uniq -c发布于 2018-01-02 10:57:46
不需要在tous.txt中存储中间结果,也不需要将整个数组保存在内存中,尽管这是一个小的效率攻击,除非您的数据集很大,否则不会有太大的区别。
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,那么最终可能会更加优雅和高效。
https://stackoverflow.com/questions/48054449
复制相似问题