我有大约 4500 行氨基酸变异,如下所示:
S1437T
H1266Y
T2662A
E1397A
E626K
S1538T
E3021K
简而言之,数字两侧的字母是氨基酸残基,数字代表残基位置。我只想检索那些在 2400 到 3100 范围内的变化。
我尝试使用grep
,但没有那么成功。另外,我知道这awk
对于这种操作可能会更好,但在awk
. 任何帮助,将不胜感激。
我有大约 4500 行氨基酸变异,如下所示:
S1437T
H1266Y
T2662A
E1397A
E626K
S1538T
E3021K
简而言之,数字两侧的字母是氨基酸残基,数字代表残基位置。我只想检索那些在 2400 到 3100 范围内的变化。
我尝试使用grep
,但没有那么成功。另外,我知道这awk
对于这种操作可能会更好,但在awk
. 任何帮助,将不胜感激。
使用大写字母作为分隔符
awk
,我们可以查看第二个字段来确定是否应该提取该行:实际上,由于使用包含数字和非数字混合的字段作为数字会将字段转换为数字,在第一个非数字处停止,因此将行上的第一个字符视为分隔符就足够了:
使用
sed
,它有点棘手,因为该工具在算术方面是出了名的糟糕。下面的命令只是作为一个有趣的干扰。在这里,我们针对输入数据中的每一行匹配三个正则表达式,如果匹配则打印该行。第一个表达式处理范围 2400-2999,而第二个表达式处理范围 3000-3099。我们用第三个表达式分别测试 3100。在每个测试中,我们要求一个大写字符出现在数字的两侧。
一个稍长的编辑脚本,可以更有效地执行测试:
不带参数的
b
命令使脚本分支到最后,隐式打印操作输出当前行。d
对不包含匹配项的行执行最终命令。这确保了匹配的行不会被测试超过必要的次数。perl
提取第一个数字序列并\d+
随后检查其值:awk
从当前行 ( )中删除前导和尾随字母r
:输出:
使用 Raku(以前称为 Perl_6)
或者
样本输入:
样本输出:
简而言之,Raku 在命令行中被调用,带有
-ne
标志(非自动打印,逐行读取)。Raku'sgrep
用于查找<digit>+
(一个或多个数字)的匹配项,如果找到,则在{...}
块内测试这些值以查看它们是否满足范围条件。请注意如何使用{2400 <= $0 <= 3100}
条件块一次性测试范围。第二个例子
$<loc>
展示了 Raku 的named-captures实现。有关详细信息,请参阅下面的 URL。最后,Raku 提供了一个实际的
Range
对象类,所以上面的代码可以写成如下,带有一个~~
智能匹配运算符和一个2400..3100
范围。下面产生与上面相同的示例输出:https://docs.raku.org/syntax/Named%20captures
https://docs.raku.org/type/Range
https://raku.org
Python 具有链式比较功能,可与意图密切相关。
还可以创建一个范围对象并与之进行比较所以如果使用以下内容,我们可以替换链式比较:
我们可以使用 perl 的 grep 命令来搜索数字的存在。
在这里,我们使用 GNU sed 为 GNU dc 命令预处理数据,然后通过比较乘积 (num-lowerlim)x(upperlim-num) >= 0 来检查范围成员资格是否适合打印。
在此方法中,我们首先从第二列开始对数字进行排序