场景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/