我有一个像这样的输入文件:
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