我有一个带有两个制表符分隔列的文件,一个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
答案 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