Text-Processing

Grep 獲取一系列數字

  • March 8, 2021

我有一個包含多行的 .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樹字元,並呼叫這些r1r2. 我substr()用來提取欄位數據中固定位置的數字,但如果您確定唯一的數字是您感興趣的數字,您也可以刪除所有非數字。您會這樣做

r1 = $1; gsub("[^[:digit:]]", "", r1)

同樣用於r2使用$2.

如果最後的條件為真,則列印目前行。

使用awk

awk -F'(^| )...|-' '$2>300 && $2<425 || $4>300 && $4<425' infile

在這裡,我們將欄位分隔符設置為:

  • 行首後跟 3 個字元^...,或
  • 後跟 3 個字元的空格 ...,或
  • 連字元

然後基於這些,第 2 列和第 4 列將是氨基酸的殘基,因此我們檢查它是否在給定範圍之間。

引用自:https://unix.stackexchange.com/questions/638188