具有awk和执行顺序的多个过程
问题分两部分: 第一部分: 首先我有一个序列AATTCCGG,我想把它改成TAAGGCC。我使用gsub将A更改为T,C更改为G,G更改为C,T更改为A。不幸的是,awk按顺序执行这些命令,因此我最终使用AAACCCC。我通过使用大写和小写来解决这个问题,然后将其转换回大写值,但如果可能的话,我希望在一个步骤中完成这项工作 例如:具有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","
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