如何用Awk命令为已排序的两列数据生成带排名格式的第三列?
用Awk生成自定义排名列的解决方案
没问题,既然排序已经搞定了,那生成第三列的事儿交给Awk就完事了!核心思路就是用一个数组来跟踪每个第二列值(也就是你说的word)的出现次数,每遇到同一个word就递增计数,然后把计数和word拼接成要求的格式。
具体命令
假设你已经把排序后的内容通过管道传给Awk,或者直接处理排序后的文件,命令如下:
awk '{count[$2]++; print $0, count[$2]"."$2}'
工作原理拆解
count[$2]++:定义一个名为count的关联数组,用第二列的内容(比如a、b、c)作为键。每处理一行,对应键的计数就加1——这样同一word的排名就会从1开始自动递增。print $0, count[$2]"."$2:先打印当前行的所有内容($0),然后拼接出第三列:当前word的计数 + 点号 + word本身,比如第一次遇到a就输出1.a,第二次遇到b就输出2.b。
示例验证
拿你给出的排序后输入来测试:
16 a
50 b
32 b
25 c
15 c
12 c
运行命令后会输出:
16 a 1.a 50 b 1.b 32 b 2.b 25 c 1.c 15 c 2.c 12 c 3.c
完全符合你要的预期格式!
可选:排序+生成列一步到位
如果你还没把排序和生成列结合起来,也可以直接把排序命令和Awk串起来:
sort -k2,2 -k1,1nr your_input_file.txt | awk '{count[$2]++; print $0, count[$2]"."$2}'
这里sort -k2,2 -k1,1nr就是先按第二列升序排序,再按第一列降序排序,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者jar-jar
相关产品推荐
相关产品推荐

