逐行解析字符串和复制行中的关键字符

时间:2014-02-23 18:41:21

标签: regex bash parsing sed awk

我正在尝试解析DNA蛋白文件。我想提取一定数量的信息。我想解析只有当行以“ATOM”开头并且在第四列的末尾有G,A,T,C时才解析。例如,在下面的片段中,DG将被解析,因为它最后有一个G.然后将该行保存在文件中。我正在使用bash。你会用什么来做这个? grep,find,sed,awk或某种正则表达式?

感谢您的帮助!

    HETATM  103 HG22 MVA A   8       4.999  -1.260   2.090  1.00  0.00           H            
    HETATM  104 HG23 MVA A   8       5.639  -2.810   2.604  1.00  0.00          H  
    TER     105      MVA A   8                                                      
    ATOM    106  O5'  DG C  11     -12.710   1.571 -11.945  1.00  0.00           O  
    ATOM    107  C5'  DG C  11     -13.491   2.438 -11.111  1.00  0.00           C  

除了原始问题之外:

计算行总数和个别G,A,T,C?将计算的总数输出到文件中,如Total Lines,TOTAL G,TOTAL T,TOTAL A,TOTAL C。

5 个答案:

答案 0 :(得分:6)

awk '/^ATOM/&&$4~/[GATC]$/' input > output

答案 1 :(得分:2)

这是一种旧时尚bash方式:

while read -ra fld; do 
  [[ ${fld[0]} == "ATOM" ]] && [[ ${fld[3]} =~ [GATC]$ ]] && echo "${fld[@]}"
done < dnafile.old > dnafile.new

答案 2 :(得分:0)

嗯...在优秀的肯特的awk解决方案之后犹豫写了一个长期的正则表达式:) :)

grep -P 'ATOM\s+\S+\s+\S+\s*\S*[GATC]\s+' dnafile

这需要一个带有-P - perl正则表达式的grep。

如果没有perl正则表达式,标准正则表达式会更长,

grep  'ATOM  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ]*[GATC]  *' dnafile

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/^ATOM.{15}[GATC]/w newfile' oldfile

由于列可能为空,因此必须在行中的位置进行匹配。

答案 4 :(得分:0)

希望我有机会回答这个问题,因为OP质疑肯特的回答。这是一个问题:

If you notice Line 3 of the example the 3rd column is blank will this matter, it shouldn't in this case because its not an ATOM but if it was?

所以修复就在这里,(基于格式和位置不会改变。

awk '/^ATOM/&&substr($0,20,1)~/[GATC]/'  file

测试结果:

$ cat file
HETATM  103 HG22 MVA A   8       4.999  -1.260   2.090  1.00  0.00           H
HETATM  104 HG23 MVA A   8       5.639  -2.810   2.604  1.00  0.00           H
ATOM    105      MVA X   8
ATOM    106  O5'  DG C  11     -12.710   1.571 -11.945  1.00  0.00           O
ATOM    107  C5'  DG C  11     -13.491   2.438 -11.111  1.00  0.00           C

$ awk '/^ATOM/&&substr($0,20,1)~/[GATC]/'  file
ATOM    105      MVA X   8
ATOM    106  O5'  DG C  11     -12.710   1.571 -11.945  1.00  0.00           O
ATOM    107  C5'  DG C  11     -13.491   2.438 -11.111  1.00  0.00           C

编辑新请求。

awk '/^ATOM/&&substr($0,20,1)~/[GATC]/{print;l++;a[substr($0,20,1)]++}END{printf "total line : %s\n",l;for (i in a) printf "%s : %s \n",i,a[i]}'  file

ATOM    105      MVA A   8
ATOM    106  O5'  DG C  11     -12.710   1.571 -11.945  1.00  0.00           O
ATOM    107  C5'  DG C  11     -13.491   2.438 -11.111  1.00  0.00           C
total line : 3
A : 1
G : 2