Linux命令用条件替换模式

时间:2014-12-12 11:17:29

标签: linux shell

我还在学习Linux命令,我想知道是否有人可以帮助我解决我想要做的事情:我有一个这样的文件:

3       rs123     0       600001   A       G
3       rs345     0        600002  T       G
3   3:124369637:A_G 0   124369637   A   G
3   3:124369637:G_GT    0   124369637   G   GT

我试图在第二次出现结肠后用" ID"替换任何东西。只有当第5列和第6列的长度大于1时,如果长度为1,我需要删除第二次冒号后的任何内容。所以我想这样:

3       rs123     0       600001   A       G
3       rs345     0        600002  T       G
3   3:124369637 0   124369637   A   G
3   3:124369637:ID  0   124369637   G   GT

我已经尝试了几种方式,我可以达到某种程度但我仍然坚持最后一部分。而且,我现在看起来很长并且扭曲了。非常感谢任何建议!谢谢!

首先我这样做是为了添加":ID"使用此格式的所有案例3:124369637:

awk -F' ' '//{gsub(/[:][A-Za-z].*/, ":ID", $2); print} file.txt

然后我尝试将此ID保留仅用于第5列和第6列的长度> 1的情况(但这不起作用):

awk -F' ' '{
if (length($5) ==1 && length($6) ==1 && $2 ~/ID/ )
    gsub(/ID/,"");print;
    else
    print;
    }' file.txt

1 个答案:

答案 0 :(得分:2)

awk -v OFS='\t' '
{
    if (length($5) == 1 && length($6) == 1 )
    {
        sub(/:[^:]*$/, "", $2)
        print
    }
    else if ( length($5) >= 1 && length($6) >= 1 )
    {
        sub(/:[^:]*$/, ":ID", $2)
        print
    }
    else
        print
}'
file.txt

试试这个。您可能想要修改替换logit,我想每行至少有两个冒号。