Text-Processing
Grep 獲取一系列數字
我有一個包含多行的 .txt 文件,其中提供了氨基酸和殘基數據。數據如下所示:
ARG262-Side ASP368-Side 140,83% ARG95-Side GLU107-Side 103,73% ARG474-Side VAL468-Main 94,93% PHE169-Main ALA190-Main 94,63% THR205-Side ASP203-Side 94,07% ILE299-Main LYS249-Main 94% LEU354-Main LYS365-Main 93,6% ARG346-Side GLU263-Side 93,57% LEU301-Main ALA247-Main 93,43% ALA190-Main PHE169-Main 93,37% SER252-Side ASP296-Side 93,1% TYR424-Side ASN446-Main 93%
我可以粗略地說,數字表示殘基,字母表示氨基酸。因此,在每一行的第一個和第二個欄位中,前面的部分
-
都由一個氨基酸標識符和一個殘基值組成。我只想列印看到殘基值在一定範圍內的行,不管氨基酸如何,也不管第一個或第二個欄位是否符合標準。例如,從上面的輸入文件中,我想提取僅包含300-425之間殘基的數據。在這種情況下,我的輸出應該如下所示:
ARG262-Side ASP368-Side 140,83% LEU354-Main LYS365-Main 93,6% ARG346-Side GLU263-Side 93,57% LEU301-Main ALA247-Main 93,43% TYR424-Side ASN446-Main 93%
我嘗試為此使用該
grep
命令,但不是很成功。有沒有我可以使用的命令grep
?
主要處理正則表達式的工具在處理數字方面是出了名的差。在這種情況下,我建議使用類似的東西,
awk
而不是grep
:$ awk '{ r1 = substr($1,4,3); r2 = substr($2,4,3) } (r1 >= 300 && r1 <= 425) || (r2 >= 300 && r2 <= 425)' file ARG262-Side ASP368-Side 140,83% LEU354-Main LYS365-Main 93,6% ARG346-Side GLU263-Side 93,57% LEU301-Main ALA247-Main 93,43% TYR424-Side ASN446-Main 93%
程式碼從每行的前兩個空格分隔的欄位中提取從偏移量 4 開始的
awk
樹字元,並呼叫這些r1
和r2
. 我substr()
用來提取欄位數據中固定位置的數字,但如果您確定唯一的數字是您感興趣的數字,您也可以刪除所有非數字。您會這樣做r1 = $1; gsub("[^[:digit:]]", "", r1)
同樣用於
r2
使用$2
.如果最後的條件為真,則列印目前行。
使用
awk
:awk -F'(^| )...|-' '$2>300 && $2<425 || $4>300 && $4<425' infile
在這裡,我們將欄位分隔符設置為:
- 行首後跟 3 個字元
^...
,或- 後跟 3 個字元的空格
...
,或- 連字元
然後基於這些,第 2 列和第 4 列將是氨基酸的殘基,因此我們檢查它是否在給定範圍之間。