列の代わりに特定の場所から単語ごとに行を抽出する方法は?

列の代わりに特定の場所から単語ごとに行を抽出する方法は?

次の入力ファイルがあります。

                     v
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
TER    1648      ILE C 206
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99
                     ^

A表示された場所にのみ行を含めるだけです。最初の行と同様に、ほとんどの行では、A5番目の列は単一文字です。ただし、場合によっては、4番目の列(2行目など)または文字列(最後の行など)にある場合があります。 22文字以外には単一の文字がA表示されることがありますが、ここに表示される場合にのみ興味があります。

A単一でも文字列でも、次の行のみを含めるには出力が必要です。

ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99

Aしかし、時には列に関係なく単一行だけを抽出したい場合があります。

ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50

答え1

あなたはそれを使用することができます

grep -E '^.{21}A' file

このようなケースを含めたいA1023場合

grep -E '^.{21}A\>' file

A行を別の文字でのみ表示したい場合

メモ:2 番目の例では、記号は次の空の\>文字列と一致します。

grep のマニュアルページから

バックスラッシュ文字と特殊式

シンボルは、それぞれ単語の先頭と末尾の空の文字列\<と一致します。\>この記号は、\b単語の端にある空の文字列と一致し、\B単語の端にない空の文字列と一致します。記号は\wの同義語 [_[:alnum:]] であり、\Wの同義語です[^_[:alnum:]]

答え2

大きな打撃:

while IFS= read -r line; do 
    [[ ${line:21:2} == "A " ]] && echo "$line"
done < file

答え3

> awk -v FS= '{ print $22 }' file
A
A
C
A

> awk -v FS= '$22=="A" { print; }' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99

答え4

そしてGNU grep

$ grep -P '\bA\b' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50

関連情報