具有awk和执行顺序的多个过程

具有awk和执行顺序的多个过程,awk,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","

问题分两部分:

第一部分: 首先我有一个序列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}'
输出: AACCC

第二部分: 在启动第二组指令之前,有没有办法让awk运行到一组指令的文件末尾?我尝试了下面的一些方法,但没有成功

对于数据集

1 A
2 B
3 C
4 D
5 E
我正在使用下面的管道获取我想要的数据(只是一个示例)


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

这可以通过
tr
有效解决:

$ echo AATTCCGG | tr ATCG TAGC

关于第二部分(这应该是一个不同的问题):不,使用awk是不可能的,管道就是出路。

对于第二部分,请尝试以下命令:

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

下面是我使用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
cat sub.awk
awk'
开始{d[“G”]=“C”;d[“C”]=“G”;d[“T”]=“A”;d[“A”]=“T”;FS=”“;OFS=”“}
{for(i=1;i
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