AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 676969
Accepted
structural_lexa
structural_lexa
Asked: 2021-11-11 14:15:01 +0800 CST2021-11-11 14:15:01 +0800 CST 2021-11-11 14:15:01 +0800 CST

如何提取一些范围内的值

  • 772

我有大约 4500 行氨基酸变异,如下所示:

S1437T
H1266Y
T2662A
E1397A
E626K
S1538T
E3021K

简而言之,数字两侧的字母是氨基酸残基,数字代表残基位置。我只想检索那些在 2400 到 3100 范围内的变化。

我尝试使用grep,但没有那么成功。另外,我知道这awk对于这种操作可能会更好,但在awk. 任何帮助,将不胜感激。

text-processing bioinformatics
  • 5 5 个回答
  • 289 Views

5 个回答

  • Voted
  1. they
    2021-11-11T23:08:37+08:002021-11-11T23:08:37+08:00

    使用大写字母作为分隔符awk,我们可以查看第二个字段来确定是否应该提取该行:

    $ awk -F '[[:upper:]]' '$2 >= 2400 && $2 <= 3100' file
    T2662A
    E3021K
    

    实际上,由于使用包含数字和非数字混合的字段作为数字会将字段转换为数字,在第一个非数字处停止,因此将行上的第一个字符视为分隔符就足够了:

    $ awk -F '^.' '$2 >= 2400 && $2 <= 3100' file
    T2662A
    E3021K
    

    使用sed,它有点棘手,因为该工具在算术方面是出了名的糟糕。下面的命令只是作为一个有趣的干扰。

    在这里,我们针对输入数据中的每一行匹配三个正则表达式,如果匹配则打印该行。第一个表达式处理范围 2400-2999,而第二个表达式处理范围 3000-3099。我们用第三个表达式分别测试 3100。在每个测试中,我们要求一个大写字符出现在数字的两侧。

    $ sed -n \
        -e '/^[[:upper:]]2[4-9][0-9][0-9][[:upper:]]$/p' \
        -e '/^[[:upper:]]30[0-9][0-9][[:upper:]]$/p' \
        -e '/^[[:upper:]]3100[[:upper:]]$/p' file
    T2662A
    E3021K
    

    一个稍长的编辑脚本,可以更有效地执行测试:

    $ sed \
        -e '/^[[:upper:]]2[4-9][0-9][0-9][[:upper:]]$/b' \
        -e '/^[[:upper:]]30[0-9][0-9][[:upper:]]$/b' \
        -e '/^[[:upper:]]3100[[:upper:]]$/b' \
        -e d file
    T2662A
    E3021K
    

    不带参数的b命令使脚本分支到最后,隐式打印操作输出当前行。d对不包含匹配项的行执行最终命令。这确保了匹配的行不会被测试超过必要的次数。

    • 4
  2. Best Answer
    Stéphane Chazelas
    2021-11-11T23:30:34+08:002021-11-11T23:30:34+08:00

    perl提取第一个数字序列并\d+随后检查其值:

    $ perl -ne 'print if /\d+/ && $& >= 2400 && $& <= 3100' < your-file
    T2662A
    E3021K
    
    • 4
  3. Cyrus
    2021-11-11T14:25:54+08:002021-11-11T14:25:54+08:00

    awk从当前行 ( )中删除前导和尾随字母r:

    awk '{r=$0; gsub(/^[A-Z]/,"",r); gsub(/[A-Z]$/,"",r)} r>=2400 && r<=3100' file
    

    输出:

    T2662A
    E3021K
    
    • 2
  4. jubilatious1
    2021-11-12T01:54:37+08:002021-11-12T01:54:37+08:00

    使用 Raku(以前称为 Perl_6)

    raku -ne '.put if .grep(/ (<digit>+) / && {2400 <= $0 <= 3100});'
    

    或者

    raku -ne '.put if .grep(/ $<loc> = [<digit>+] / && {2400 <= $<loc> <= 3100} );'
    

    样本输入:

    S1437T
    H1266Y
    T2662A
    E1397A
    E626K
    S1538T
    E3021K
    

    样本输出:

    T2662A
    E3021K
    

    简而言之,Raku 在命令行中被调用,带有-ne标志(非自动打印,逐行读取)。Raku'sgrep用于查找<digit>+(一个或多个数字)的匹配项,如果找到,则在{...}块内测试这些值以查看它们是否满足范围条件。请注意如何使用{2400 <= $0 <= 3100}条件块一次性测试范围。

    第二个例子$<loc>展示了 Raku 的named-captures实现。有关详细信息,请参阅下面的 URL。

    最后,Raku 提供了一个实际的Range对象类,所以上面的代码可以写成如下,带有一个~~智能匹配运算符和一个2400..3100范围。下面产生与上面相同的示例输出:

    raku -ne '.put if .grep(/ $<loc> = [<digit>+] / && { $<loc> ~~ 2400..3100 } );'
    

    https://docs.raku.org/syntax/Named%20captures
    https://docs.raku.org/type/Range
    https://raku.org

    • 1
  5. guest_7
    2021-11-12T16:29:25+08:002021-11-12T16:29:25+08:00

    Python 具有链式比较功能,可与意图密切相关。

    python3 <<\eof
    with open('file') as f:
      for l in f:
        n = int(l[1:-2])
        if 2400 <= n <= 3100:
          print(l,end="")
    eof
    T2662A
    E3021K
    

    还可以创建一个范围对象并与之进行比较所以如果使用以下内容,我们可以替换链式比较:

    if n in range(2400,3100+1):
    

    我们可以使用 perl 的 grep 命令来搜索数字的存在。

    perl -lne 'my $n = s/\D//gr;
      print if grep(/^$n$/,2400..3100);
    ' file
    

    在这里,我们使用 GNU sed 为 GNU dc 命令预处理数据,然后通过比较乘积 (num-lowerlim)x(upperlim-num) >= 0 来检查范围成员资格是否适合打印。

    sed -Ee '
      h;s/.(.*)./\1/
      x;s/.*/[&]/;G;
      s/\n/ /
    ' file |
    dc -e "
    [q]sq [p]sp
    [2400-r3100r-*0!>p]su
    [?z0=q dlux c z0=?]s?
    l?x
    "
    

    在此方法中,我们首先从第二列开始对数字进行排序

    sort -k1.2n file |
    awk '{n=0+substr($0,2)}
    n < 2400 {next}
    n > 3100 {exit}
    1'
    
    • 0

相关问题

  • grep 从 $START 到 $END 的一组行并且在 $MIDDLE 中包含匹配项

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve