更改 uniq -c 命令的格式

更改 uniq -c 命令的格式

我想从文件中获取唯一的单词及其计数。当我运行以下命令时,

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

相关内容