两部分问题:
第一部分: 首先,我有一个序列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}'
我正在使用管道重新运行该程序,但是我发现如果我不必重新运行该程序会更快。
答案 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