在不使用 'uniq -c' 命令的情况下计算每个单词出现次数的替代方法是什么?

what is the alternate way to count the occurrence of each word without using 'uniq -c' command?

是否可以像使用 uniq -c 一样计算每个单词的出现次数,但使用 之后 而不是之前的计数?

示例场景

名为 text1.txt 的输入文件包含以下数据

Renault:cilo:84563
Renault:cilo:84565
M&M:Thar:84566
Tata:nano:84567
M&M:quanto:84568
M&M:quanto:84569

以上数据中使用的字段为car_company:car_model:customerID

想要的结果

cilo   2
Thar   1
nano   1
quanto 2

(car_model 和按 car_model 分组的售出汽车数量)

我的代码

cat test1.txt | cut -d: -f2 | uniq -c

实际结果

   2 cilo   
   1 Thar   
   1 nano   
   2 quanto 

是否可以在不使用 uniq -c 的情况下执行上述过程,以便我可以交换字段(列)的顺序?

将命令输出保存到文件中"badresult";

cat test1.txt | cut -d: -f2 | uniq -c > badresult

然后将第7个字段剪切下来,保存到文件中,命名为"counts"(要用space(" ")作为分隔符);

cut -d" " -f7 badresult > counts

然后把第八个字段剪切下来,保存到一个文件中,文件名是"models"(要用space(" ")作为分隔符);

cut -d" " -f8 badresult > models

现在您将计数和模型放在单独的文件中。你所要做的就是用"pr"命令分别显示这两个文件(-m:每列一个文件,-T:无预信息)

pr -m -T models counts

使用awk:

cat test1.txt | cut -d: -f2 | uniq -c | awk '{ t = ;  = ;  = t; print }'

小 awk 代码使用临时交换字段 1 和 2。

您可以使用 uniq,只需 post 处理其输出以交换列:

cut -d: -f2 test1.txt | uniq -c | awk '{print  "\t"  "\n" }'

编辑:已添加 \n,如评论中所述。

你只需要 awk 即可:

$ awk -F: '{a[]++} END {for (i in a) print i, a[i]}' file
cilo 2
quanto 2
nano 1
Thar 1

这遍历每一行以跟踪第二个字段出现的次数。由于所有内容都存储在数组 a 中,因此只需循环遍历并打印其内容即可。