使用awk和执行顺序进行多次传递

时间:2013-12-16 20:23:54

标签: awk

两部分问题:

第一部分: 首先,我有一个序列AATTCCGG,我想改为TAAGGCC。我使用gsub将A改为T,C改为G,G改为C,T改为A.不幸的是awk顺序执行这些命令,所以我最终得到了AAACCCC。我通过使用大写和小写,然后转换回大写值来解决这个问题,但如果可能,我想在一个步骤中完成此操作。

示例:

echo AATTCCGG | awk '{gsub("A","T",$1);gsub("T","A",$1);gsub("C","G",$1);gsub("G","C",$1);print $0}'

输出: AAAACCCC

第二部分: 有没有办法让awk在开始第二组之前运行到一组文件的结尾?我尝试了以下一些方法,但没有成功

用于数据集

1 A
2 B
3 C
4 D
5 E

我使用以下管道来获取我想要的数据(只是一个例子)

awk '{if ($1%2==0)print $1,"E";else print $0}' test | awk '{if ($1%2==0 && $2=="E") print $0}'

我正在使用管道重新运行该程序,但是我发现如果我不必重新运行该程序会更快。

3 个答案:

答案 0 :(得分:3)

使用tr

可以有效解决这个问题
$ echo AATTCCGG | tr ATCG TAGC

关于第二部分(这应该是一个不同的问题,真的):不,用awk是不可能的,管道是可行的方法。

答案 1 :(得分:0)

第二部分,尝试这个命令:

awk '{if ($1%2==0)print $1,"E"}' test 

答案 2 :(得分:0)

这是我使用awk在问题的第一部分找到的方法。它使用数组和for循环。

cat sub.awk
awk '
        BEGIN{d["G"]="C";d["C"]="G";d["T"]="A";d["A"]="T";FS="";OFS=""}
        {for(i=1;i<(NF+1);i++)
                {if($i in d)
                        $i=d[$i]}
                                }
        {print}'

Input/Output:
ATCG
TAGC