我想从文件中获取唯一的单词及其计数。当我运行以下命令时,
sort words.txt | uniq -c
2 america
4 and
1 england
1 file
1 for
1 place
但我想要以下格式的输出
america,2
and,4
england,1
file,1
for,1
place,1
我的输入文件约为 30-40Gb。那么以这种格式打印输出的最佳方法是什么?
答案1
您可以awk
在命令末尾添加一行。例如,
sort words.txt | uniq -c | awk '{print $2","$1}'
基本上,它将第二列放在第一列之前,并用逗号分隔。我不知道在 30-40Gb 文件上运行它的成本是多少。
答案2
我们可以用 awk 本身来做...
尝试下面,
awk '{j[$0]++} END {for (i in j) print i","j[i]}' words.txt
答案3
和sed
:
sort words.txt | uniq -c | sed -E 's/^ *([0-9]) (.+)/\2,\1/g'
使用 GNU、Busybox 和 BSD 实现进行了测试sed
。输出将是:
america,2
and,4
england,1
file,1
for,1
place,1
我对 200MB 文件进行了测试,发现它sed
本身仍然相当快:
$ time sed -E 's/^ *([0-9]) (.+)/\2,\1/g' HUGE | head
america,2
and,4
england,1
file,1
for,1
place,1
america,2
and,4
england,1
file,1
real 0m0.006s
user 0m0.003s
sys 0m0.006s
-i
但是,使用这两个选项以及使用>
shell 运算符重定向输出,将数据保存到磁盘上的文件需要花费大量时间:
$ time sed -i -E 's/^ *([0-9]) (.+)/\2,\1/g' HUGE
real 0m45.793s
user 0m31.965s
sys 0m13.574s
$ time sed -E 's/^ *([0-9]) (.+)/\2,\1/g' HUGE > HUGE_NO_I
real 0m29.016s
user 0m28.684s
sys 0m0.119s