如何按特定位置的单词而不是列提取行?

如何按特定位置的单词而不是列提取行?

我有一个像这样的输入文件:

                     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我只需要包含在标记位置的行。在大多数行中,A与第一行一样,第五列是单个字符。但是,有时它位于第四列(如第二行),或者位于字符串(如最后一行)中。请注意,A单个字符可以出现在 22 以外的位置,但我只关心它何时出现在这里。

我需要我的输出仅包含带有 的行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

但有时我也想只提取带有 single 的行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如果您只想要显示为独立字符的行

笔记:在第二个示例中,符号\>将匹配任何尾随的空字符串。

摘自 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

相关内容