2017-08-08 154 views
1

給定一個文件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 

但是,這個和各種類似的版本不起作用。有人能指出什麼是不正確的嗎?

回答

1

只是做字符串逆轉和翻譯在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

0

如果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