【问题标题】:How do I number duplicate lines sequentially?如何按顺序编号重复行?
【发布时间】:2018-01-26 06:40:37
【问题描述】:

我想对重复的行按顺序编号。可能使用 awk,但任何 unix 代码都可以。比如我想

3J8934
4Y9384
3T2938
3J8934
4Y9384
7I5938

成为

3J8934_01
4Y9384_01
3T2938_01
3J8934_02
4Y9384_02
7I5938_01

到目前为止,我已经能够使用 awk 用_02 标记重复项,但它不会用_01 标记第一个或不重复项。

awk 'cnt[$0]++{$0=$0"_0"cnt[$0]}1' filename.txt

【问题讨论】:

    标签: bash awk rename


    【解决方案1】:

    你已经很接近了。以下是我的做法:

    $ awk '{ $0 = $0 sprintf("_%02d", ++count[$0]) } 1' infile
    3J8934_01
    4Y9384_01
    3T2938_01
    3J8934_02
    4Y9384_02
    7I5938_01
    

    对于每一行,我们附加sprintf("_%02d", ++count[$0]),即,下划线后跟一个数字,如果适用,零填充到两位数。该数字的值为++count[$0]:这是我们已经看到该行的次数。

    count是整行索引的关联数组;它是由++预先增加的,即首先增加,然后打印。当我们第一次看到一行时,计数器被隐式初始化为零,递增,我们追加_01,等等。

    末尾的1{ print $0 } 的简写,因为这是任何真实条件的默认操作。

    【讨论】:

    • @dood 添加了解释。
    猜你喜欢
    • 2017-01-21
    • 2013-03-22
    • 2018-08-20
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多