使用awk

时间:2016-03-29 19:36:32

标签: awk duplicates gawk

我有一个带有两个制表符分隔列的文件,一个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的第2个实例,附加" b"在这些行的ID上:

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

3 个答案:

答案 0 :(得分:2)

如果有任意多的潜在重复,我会选择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

排序

答案 1 :(得分:1)

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

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

假设您的输入位于doubles.csv,请按照此awk -f doubles.awk doubles.csv运行脚本。

答案 2 :(得分:0)

另一个awk

$ awk 'BEGIN{FS=OFS="\t"} {$1=$1(a[$1]++?"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