繁体   English   中英

使用awk提取两个单独的字符串

[英]Using awk to extract two separate strings

MacOS,Unix

所以我有一个以下斯德哥尔摩格式的文件:

# STOCKHOLM 1.0

#=GS WP_002855993.1/5-168 DE [subseq from] MULTISPECIES: AAC(3) family N-acetyltransferase [Campylobacter]
#=GS WP_002856586.1/5-166 DE [subseq from] MULTISPECIES: aminoglycoside N(3)-acetyltransferase [Campylobacter]

WP_002855993.1/5-168         ------LEHNGKKYSDKDLIDAFYQLGIKRGDILCVHTELmkfgKALLT.K...NDFLKTLLECFFKVLGKEGTLLMP-TF---TYSF------CKNE------VYDKVHSKG--KVGVLNEFFRTSGgGVRRTSDPIFSFAVKGAKADIFLKEN--SSCFGKDSVYEILTREGGKFMLLGLNYG-HALTHYAEE-----
#=GR WP_002855993.1/5-168 PP ......6788899999***********************9333344455.6...8999********************.33...3544......4555......799999975..68********98626999****************999865..689*********************9875.456799996.....
WP_002856586.1/5-166         ------LEFENKKYSTYDFIETFYKLGLQKGDTLCVHTEL....FNFGFpLlsrNEFLQTILDCFFEVIGKEGTLIMP-TF---TYSF------CKNE------VYDKINSKT--KMGALNEYFRKQT.GVKRTNDPIFSFAIKGAKEELFLKDT--TSCFGENCVYEVLTKENGKYMTFGGQG--HTLTHYAEE-----
#=GR WP_002856586.1/5-166 PP ......5566677788889999******************....**9953422246679*******************.33...3544......4455......799998876..589**********.******************99999886..689******************999765..5666***96.....
#=GC PP_cons                 ......6677788899999999*****************9....77675.5...68889*******************.33...3544......4455......799999976..689*******998.8999**************99999876..689******************9998765.466699996.....
#=GC RF                      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....xxxxx.x...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

WP_002855993.1/5-168         -----------------------------------------------------------------------------------------------------
#=GR WP_002855993.1/5-168 PP .....................................................................................................
WP_002856586.1/5-166         -----------------------------------------------------------------------------------------------------
#=GR WP_002856586.1/5-166 PP .....................................................................................................
#=GC PP_cons                 .....................................................................................................
#=GC RF                      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//

我创建了一个脚本来提取我想要的ID(在本例中为WP_002855993.1和WP_002856586.1),并搜索另一个文件以提取具有适当ID的DNA序列。 脚本如下:

#!/bin/bash

for fileName in *.sto;
do
protID=$(grep -o "WP_.\{0,11\}" $fileName | sort | uniq)
echo $protID
file=$(echo $fileName | cut -d '_' -f 1,2,3)
file=$(echo $file'_protein.faa')
echo $file 
if [ -n "$protID" ]; then
gawk "/^>/{N=0}/^.*$protID/{N=1} {if(N)print}" $file >> 
sequence_protein.file
fi
done

这是我正在浏览的文件类型的示例:

>WP_002855993.1 MULTISPECIES: AAC(3) family N-acetyltransferase [Campylobacter]
MKYFLEHNGKKYSDKDLIDAFYQLGIKRGDILCVHTELMKFGKALLTKNDFLKTLLECFFKVLGKEGTLLMPTFT
>WP_002856586.1 MULTISPECIES: aminoglycoside N(3)-acetyltransferase [Campylobacter]
MKYLLEFENKKYSTYDFIETFYKLGLQKGDTLCVHTELFNFGFPLLSRNEFLQTILDCFFEVIGKEGTLIMPTFT
YSFCKNEVYDKINSKTKMGALNEYFRKQTGVKRTNDPIFSFAIKGAKEELFLKDTTSCFGENCVYEVLTKENGKY
>WP_002856595.1 MULTISPECIES: acetyl-CoA carboxylase biotin carboxylase subunit [Campylobacter]
MNQIHKILIANRAEIAVRVIRACRDLHIKSVAVFTEPDRECLHVKIADEAYRIGTDAIRGYLDVARIVEIAKACG

如果我有一个ID,则此脚本可以工作,但是在某些情况下,我有两个ID,但会出现错误,因为我认为它正在寻找一个ID,例如“ WP_002855993.1 WP_002856586.1”。 有没有办法修改此脚本,以便它查找两个单独的事件? 我想这与gawk命令有关,但是我不确定到底是什么。 提前致谢!

原始脚本的更新:

#!/usr/bin/env bash

for file_sto in *.sto; do
   file_faa=$(echo $file_sto | cut -d '_' -f 1,2,3)
   file_faa=${file_faa}"_protein.faa"

   awk '(NR==FNR) { match($0,/WP_.\{0,11\}/);
                    if (RSTART > 0)  a[substr($0,RSTART,RLENGTH)]++ 
                    next; }
        ($1 in a){ print RS $0 }' $file_sto RS=">" $file_faa >> sequence_protein.file
done

awk部分甚至可以简化为:

awk '(NR==FNR) { if ($0 ~ /^WP_/) a[$1]++; next }
     ($1 in a) { print RS $0 }' FS='/' $file_sto FS=" " RS=">" $file_faa

awk脚本执行以下操作:

  1. 将字段分隔符FS设置为/并读取文件$file_sto
  2. 读取$file_sto ,记录号NR与文件记录号FNR
  3. (NR==FNR) { if ($0 ~ /^WP_/) a[$1]++; next } (NR==FNR) { if ($0 ~ /^WP_/) a[$1]++; next } :由于前面的条件,这一行仅工作一个$file_sto 它检查行是否以WP_ 如果是这样,它将第一个字段$1 (由FS分隔为/ )存储在数组a 然后,它跳到文件中的下一条记录( next )。
  4. 如果完成读取文件$file_sto ,则将字段分隔符设置回单个空格FS=" " (请参见正则表达式部分 ),并将记录分隔符RS>并开始读取文件$file_faa后者意味着$0将包含所有行在>和第一个字段$1protID
  5. 读取$file_faa ,文件记录号FNR从1重新开始,而NR未重置。 因此,第一条awk行被跳过。
  6. ($1 in a){ print RS $0 }如果第一个字段在数组a ,则打印记录,并在记录前放置记录分隔符。

修复原始脚本:

如果要保留原始脚本,可以将protID存储在一个列表中,然后循环该列表:

#!/bin/bash

for fileName in *.sto; do
    protID_list=( $(grep -o "WP_.\{0,11\}" $fileName | sort | uniq) )
    echo ${protID_list[@]}
    file=$(echo $fileName | cut -d '_' -f 1,2,3)
    file=$(echo $file'_protein.faa')
    echo $file 
    for protID in ${protID_list[@]}; do
       if [ -n "$protID" ]; then
          gawk "/^>/{N=0}/^.*$protID/{N=1} {if(N)print}" $file >> 
          sequence_protein.file
       fi
    done
done

考虑到您的输出文件已经过测试。

使用以下命令仅给您文件名:

>>cat text | awk '{print $1}' | grep -R 'WP*' | cut -d":" -f2

给我输出:

WP_002855993.1/5-168
WP_002856586.1/5-166
WP_002855993.1/5-168
WP_002856586.1/5-166

你想要这样的输出吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM