我正在尝试解析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。
答案 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