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 TACGawk内,类似于:

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

+0

fyi:http://awk.freeshell.org/不能正常工作,在https://web.archive.org/web/20170524214527/http://awk.freeshell.org/AllAboutGetline找到快照 – Sundeep

+1

是啊我注意到它大约一个月前就消失了。awk.info离开后,我开始使用该引用。也许这是在comp.lang.awk usenet group的google groups视图中最好的引用,我在其中发布了它:https://groups.google.com/forum/message/raw?msg=comp.lang.awk/2TA76BVODz4/Q9TkehK_tWYJ –

+1

建议:可能会在此处创建github回购或gist或类似的社区wiki。 – Sundeep

如果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阵列
  • $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