cat dummy_file
A ID1
A ID2
A ID3
B ID4
B ID5
C ID6
C ID7
C ID8
C ID9
下面的 Awk 命令按第一列对 dummy_file 项进行分组和枚举。
awk '{count[$1]++}; {print $0"\t"count[$1]}' dummy_file
A ID1 1
A ID2 2
A ID3 3
B ID4 1
B ID5 2
C ID6 1
C ID7 2
C ID8 3
C ID9 4
如何为这样的输出反向枚举count[$1]++(以相反的顺序枚举):
A ID1 3
A ID2 2
A ID3 1
B ID4 2
B ID5 1
C ID6 4
C ID7 3
C ID8 2
C ID9 1
请您参考如下方法:
如果输入文件确实在第一列上排序,如您在示例中所示,并且您想要“第一列的索引号以降序排列”,则:
awk '
(NR==FNR) { occured[$1]++ ; next ; }
{print $0,occured[$1]--; }
' dummy_file dummy_file
这是一个很常见的“双循环”,即我们读取文件两次,并使用“NR==FNR”区分第一遍。
上面的 awk 程序:1) 在第一遍中,增加(默认为 0)第一列中每个事物的出现次数。并跳过其余部分以转到下一行。 2)第二次传递同一文件:输出该行,在其后添加第一列的“剩余出现次数”。
给定 OP 的当前示例文件,此输出:
$ awk '
(NR==FNR) { occured[$1]++ ; next ; }
{print $0,occured[$1]--; }
' dummy_file dummy_file
A ID1 3
A ID2 2
A ID3 1
B ID4 2
B ID5 1
C ID6 4
C ID7 3
C ID8 2
C ID9 1
可以根据需要调整输出的实际呈现方式,以保持/简化/更改间距等。
