用awk修改重复字段

amending duplicated field with awk

我有一个包含两个制表符分隔列的文件,一个是 ID 列,一个是序列列。

122_mex1 TGCAGGC
122_mex1 TGAAAAA
122_mex2 TGCAGTC
122_mex2 TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC

我想为具有重复 ID(第 1 列)的每一行修改 ID 列(第 1 列)的结尾——在这个玩具数据集中,结果将是更改 122_mex1 和 122_mex2,在这些行的 ID 上附加一个 "b":

122_mex1 TGCAGGC
122_mex1b TGAAAAA
122_mex2 TGCAGTC
122_mex2b TGCAGTC
122_can4 TGCATTT
239_mex1 TGCAAAA
239_mex2 TGCAAAA
239_can4 TGCAGC

而所有其他没有任何重复的行将按原样打印。

关于如何实现这一点有什么想法吗?

谢谢, LP

这是一个使用 GNU awk 测试的 awk 脚本 (doubles.awk):

BEGIN { IFS = OFS = "\t" }
1   { 
      print  ids[  ], 
      ids[  ] = "b"
    }

假设您的输入在 doubles.csv、运行 脚本中 awk -f doubles.awk doubles.csv

如果有任意多的潜在重复项,我会选择 perl:

perl -lane '
    if ($. > 1) {
        if ($prev ne $F[0]) {
            $ext = "";
        } else {
            $ext ||= "a";   # so we start with "b"
            ++$ext;
        }
    }
    $prev = $F[0];
    $F[0] .= $ext;
    print join(" ", @F);
' file

perl 有一个奇怪的特性,其中 ++ 运算符可以递增字符串:"a" => "b", ... "z" => "aa" , "aa" => "ab", 等等

这假定您的输入文件按 ID

排序

另一个awk

$ awk 'BEGIN{FS=OFS="\t"} {=(a[]++?"b":"")}1' file

122_mex1        TGCAGGC
122_mex1b       TGAAAAA
122_mex2        TGCAGTC
122_mex2b       TGCAGTC
122_can4        TGCATTT
239_mex1        TGCAAAA
239_mex2        TGCAAAA
239_can4        TGCAGC