AWK和打印命令输出
问题描述:
给定一个文件test.txt
具有以下内容内执行bash命令:AWK和打印命令输出
ABC DEF GATTAG GHK
ABC DEF GGCGTC GHK
ABC DEF AATTCC GHK
第3列需要被修改,从而使该字符串是反向互补。部分原因可以用一个bash命令来完成:
cat test.txt | cut -f3 | rev | tr ATGC TACG
CTAATC
GACGCC
GGAATT
这怎么能与awk
实施?(存在于文件的处理,此功能将被添加到一个更大的awk脚本。)
一种可能的方式,这可能做的是通过执行rev | tr ATGC TACG
的awk
内,类似于:
awk '{newVar=system("rev | tr ATGC TACG"$3); print $1 $2 newVar $4}' test.txt
但是,这个和各种类似的版本不起作用。有人能指出什么是不正确的吗?
答
只是做字符串逆转和翻译在AWK本身:
$ awk '
BEGIN {
old="ATGC"
new="TACG"
for (i=1;i<=length(old);i++) {
tr[substr(old,i,1)] = substr(new,i,1)
}
}
{
newVar=""
for (i=1;i<=length($3);i++) {
char = substr($3,i,1)
newVar = (char in tr ? tr[char] : char) newVar
}
print $1, $2, newVar, $4
}
' file
ABC DEF CTAATC GHK
ABC DEF GACGCC GHK
ABC DEF GGAATT GHK
如果你真的觉得一个燃烧需要调用从AWK外部工具和读取结果返回那会是:
$ awk '
{
cmd="echo \047" $3 "\047 | rev | tr \047ATGC\047 \047TACG\047"
newVar=((cmd | getline line) > 0 ? line : "failed")
close(cmd)
print $1, $2, newVar, $4
}
' file
ABC DEF CTAATC GHK
ABC DEF GACGCC GHK
ABC DEF GGAATT GHK
但是您应该期望这样做会导致显着的性能下降,另请参阅getline警告:http://awk.freeshell.org/AllAboutGetline。
答
如果perl
是好的:
$ perl -lane '$F[2]=~tr/ATGC/TACG/; $F[2]=reverse $F[2]; print join " ",@F' test.txt
ABC DEF CTAATC GHK
ABC DEF GACGCC GHK
ABC DEF GGAATT GHK
-
-a
选项将分割线的空间和保存@F
阵列- 见http://perldoc.perl.org/perlrun.html#Command-Switches其他选项
- 使用
perl -i -lane
用于就地编辑
-
$F[2]=~tr/ATGC/TACG/
仅用于第三列使用tr
-
$F[2]=reverse $F[2]
扭转字符串第三列 -
print join " ",@F
打印改性阵列空间作为分隔
也可写为
perl -lane '$F[2]=reverse $F[2]=~tr/ATGC/TACG/r; print join " ",@F' test.txt
或在替换部分使用Perl代码
perl -pe 's/^(\H+\h+){2}\K\H+/reverse $&=~tr|ATGC|TACG|r/e' test.txt
fyi:http://awk.freeshell.org/不能正常工作,在https://web.archive.org/web/20170524214527/http://awk.freeshell.org/AllAboutGetline找到快照 – Sundeep
是啊我注意到它大约一个月前就消失了。awk.info离开后,我开始使用该引用。也许这是在comp.lang.awk usenet group的google groups视图中最好的引用,我在其中发布了它:https://groups.google.com/forum/message/raw?msg=comp.lang.awk/2TA76BVODz4/Q9TkehK_tWYJ –
建议:可能会在此处创建github回购或gist或类似的社区wiki。 – Sundeep