数値の範囲を見つけるための Grep

数値の範囲を見つけるための 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%

数字は残基を表し、文字はアミノ酸を表すと大まかに言うことができる。したがって、各行の第1および第2のフィールドにおいて、前の部分は-アミノ酸識別子および残基値から構成される。アミノ酸に関係なく、最初のフィールドまたは2番目のフィールドが基準を満たすかどうかにかかわらず、目に見える残差が特定の範囲内にある行のみを印刷したいと思います。

たとえば、上記の入力ファイルから次の残りの部分だけを含むデータを抽出したいとします。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

答え1

使用awk:

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

ここでは、フィールド区切り文字を次のように設定します。

  • 行の先頭の後に3つの文字が続きます^...。または
  • スペースの後に3つの文字が続きます...。または
  • ハイフン

これに基づいて、2列と4列がアミノ酸の残基であるため、与えられた範囲内にあることを確認します。

答え2

主に正規表現を扱うツールが数字を扱うのには良くないことはよく知られています。この場合、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%

コードawkは、各行のスペースで区切られた最初の2つのフィールドからオフセット4から始まるツリー文字を抽出し、それをr1sumと呼びますr2。私はフィールドデータの固定位置から数字を抽出しましたがsubstr()、興味のある数字だけが確実であれば、数字ではなくすべての数字を削除することもできます。この方法

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

同様にr2使用されます$2

最後の条件が true の場合、現在の行が印刷されます。

答え3

この試み:

grep -E '[^0-9](3[0-9][0-9]|4[01][0-9]|42[0-5])-' file`
  • -E拡張正規表現を有効にする(バックスラッシュ角括弧とパイプは不要)
  • [^0-9](- 数字ではないもの、その後ろ
    • 3[0-9][0-9]|300 ~ 399 の数字または
    • 4[01][0-9]|400から419の数字または
    • 42[0-5]420から425までの数字
  • )-その後にハイフンが続きます。

数値以外の要件を指定すると、一致しないことを意味します。ABC1234-Something

答え4

grep -E "(^[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5]))|\b[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5])))" sample.txt

grep -E拡張正規表現を使用します。

^[[:upper:]]{3}: 行が 3 つの大文字のアルファベット文字で始まる場合

3[0-9]{2}:300以上の一連の数字と一致します。

|:または

4([0-1][0-9]|2[0-5]):400〜425の間。

|:または(ここでは2番目の列を参照)

\b:世界には境界がある(空間がある)

[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5])):最初のパスと同じです。

関連情報