我有这个文件:
m64071_220512_054244/12584899/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/128321000/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
我需要tr
和reverse
字段 $4 et $5 仅当$2==rev
预计 :
m64071_220512_054244/12584899/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/128321000/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
我试过 :
perl -lpe 'if(/rev/) {$rev=/rev/;next}; if ($rev) {$F[4,5]=~tr/ATGC/TACG/; $F[4,5]=reverse $F[4,5]; print "@F"}' file
我还尝试使用 awk (在 awk 中执行 bash 命令并打印命令输出)
awk '{
if($2==rev)
{
cmd1="echo \047" $4 "\047 | rev | tr \047ATGC\047 \047TACG\047"
cmd2="echo \047" $5 "\047 | rev | tr \047ATGC\047 \047TACG\047"
newVar1=((cmd1 | getline line) > 0 ? line : "failed")
newVar2=((cmd2 | getline line) > 0 ? line : "failed")
close(cmd)
print $1, $2, $3, newVar1, newVar2
}
else {print}
}' file
要遵循问题的尝试:
可以将其放在一行中(或将其复制粘贴到大多数 shell 中),为了便于阅读,我将其展开。或者,当然,将其放入程序中,特别是如果还有更多事情要做的话。
编辑——对问题中代码的评论
要将输入字符串分解为
@F
数组(“自动拆分”),需要-a
标志由于您明确打印需要的内容,因此使用
-n
标志,而不是-p
该行中的字段 4 和 5 是数组元素 3 和 4
我假设
$F[4,5]
你指的是两个数组元素(应该是 3,4)。那么,应该是@F[3,4]
——并且带有-w
标志,对于警告,我们会听到它更重要的是,我们不能将正则表达式或
tr
模式绑定到列表,而只能绑定到单个标量。为了将其应用于tr
多个项目,需要对其进行迭代,如上所示。元素循环块中的代码
@F[3,4]
在数组的每个元素上运行,并就地修改它(因为$_
只是数组元素的别名),首先是tr
然后通过(反转和)分配。所有这些也可以写成修饰符
r
使tr
返回更改后的字符串,然后对其进行reverse
-ed,然后通过$_
别名将其分配回当前处理的数组元素这是在 Python 中执行此操作的一种方法:
输出:
在TXR Lisp 中,使用
awk
宏:如果你想尝试 Bipython(当你处理核酸序列时我强烈推荐),这里有一种方法: