场景1

我仅在第1列为CR并且第3列具有重复的行/值时才需要进行以下更改。此输入文件可包含第3列的100条重复行

第3列中的值为后缀,其顺序从a开始,然后是CR
如果我们将后缀a附加到带有CR like的z后(aCR, bCR, cCR直到zCR),则下一个后缀将是aaCR, abCR, acCR,依此类推,第3列

输入文件

a||c
CR||2157237496
CR||2157237496
CR||2157237496
INV||2157237496
RNV||3457634589

输出文件
a||c
CR||2157237496aCR
CR||2157237496bCR
CR||2157237496cCR
INV||2157237496
RNV||3457634589

方案2

需要在单独的代码中执行此操作。以下是不同的文件。我仅在第1列为DR且第3列具有重复的行/值时才需要进行以下更改。第3列中的值为后缀,其顺序从a开始,但第一个文档除外,后跟DR

如果我们在DR的z后面加上后缀a到(例如aDR, bDR, cDR直到zDR),那么下一个后缀将是aaDR, abDR, acDR ans,依此类推,第3列

输入文件
a||c
DR||3770022521
DR||3770022521
DR||3770022521
INV||9876543738

输出文件
a||c
DR||3770022521
DR||3770022521aDR
DR||3770022521bDR
INV||9876543738

我在下面的代码中尝试过,它为方案2提供了输出,但无法将序列号附加到column3。我只能在静态的后缀a后缀。
这里需要考虑第1列等于方案1的CR和方案2的DR(我无法执行)
awk -F"|" -v OFS="|" '{if(++a[$3]>1)$3=$3"a"}1' d1.txt

代码输出:
a||c
CR||2157237496
CR||2157237496a
CR||2157237496a
INV||2157237496a
RNV||3457634589

我需要分别实现方案1和2

最佳答案

编辑:当@Inian握住我的手并向我重新阅读OP时,我编辑了脚本以实际支持重复项。首先,更好的测试数据:

a||c
CR||2157237496
CR||2157237497
CR||2157237496
CR||2157237497
INV||2157237496
RNV||3457634589

方案1的awk:
$ awk '
BEGIN {
    FS=OFS="|"                       # field delimiters
    ab="zabcdefghijklmnopqrstuvwxy"  # mod safe alphabet
    d=26                             # size of alphabet
}
function i2ab(n,    b) {             # b is local var
    while(n>=1) {
        p=n%d                        # this is the letter position
        n=n/d                        # n for the next round
        n-=(n==int(n))               # fix for n%d==0 else 26 -> az, not z
        b=substr(ab,p+1,1) b         # prepend the next letter to buffer
    }
    return b                         # return buffer
}
$1=="CR" {                           # for DR change CR to DR and ++a[$3] to a[$3]++ below
    $3=$3 i2ab(++a[$3]) $1           # increment c and map it to a string
}1' file                             # output
a||c
CR||2157237496aCR
CR||2157237497aCR
CR||2157237496bCR
CR||2157237497bCR
INV||2157237496
RNV||3457634589

请参阅注释以将其更改为与方案2配合使用。

函数i2ab在26之后还提供字母组合:
$ awk '
BEGIN {
    ab="zabcdefghijklmnopqrstuvwxy"
    d=26
    print i2ab(27)                   # I AM HERE 26 -> z, 27 ->aa
}
function i2ab(n,    b) {                    #
    while(n>=1) {                           #
        p=n%d                               #
        n=n/d                               #
        n-=(n==int(n))                      #
        b=substr(ab,p+1,1) b              #####
    }                                      ###
    return b                                #
}'
aa                                    # I DID THIS

关于linux - 当列具有重复值时,Awk脚本将后缀附加到列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50247941/

10-13 03:34