gpt4 book ai didi

regex - awk unix - 匹配正则表达式 - 正则表达式字符串大小限制 |想法?

转载 作者:行者123 更新时间:2023-12-03 17:43:36 24 4
gpt4 key购买 nike

以下代码用作最小示例。它在文本中搜索一个不匹配的正则表达式(后来是一个大的 DNA 文件)。

awk 'BEGIN{print match("CTGGGTCATTAAATCGTTAGC...", /.ATC|A.TC|AA.C|AAT./)}'

后来我对找到正则表达式的位置感兴趣。因此 awk 命令更复杂。 Like it is solved here
如果我想搜索更多的不匹配和更长的字符串,我会想出很长的正则表达式:
example: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" with 3 mismatches "." allowed:
/
...AAAAAAAAAAAAAAAAAAAAAAAAAAA|
..A.AAAAAAAAAAAAAAAAAAAAAAAAAA|
..AA.AAAAAAAAAAAAAAAAAAAAAAAAA|
-
- and so on. (actually 4060 possibilities)

/
问题我的解决方案是:
  • awk 不会接受很长的正则表达式! (限制似乎约为 80.000 个字符)
  • 错误:“bash:/usr/bin/awk:参数列表太长”
  • 可能的解决方案:SO-Link但我没有找到解决方案...

  • 我的 问题 是:
  • 我还能以某种方式使用长正则表达式吗?
  • 拆分字符串并多次运行命令可能是一个解决方案,但是我会得到重复的结果。

  • 有没有另一种方法来解决这个问题?
  • (“agrep”可以工作,但不能找到位置)

  • 最佳答案

    正如乔纳森莱夫勒指出的那样in comments您在第一种情况下的问题( bash: /usr/bin/awk: Argument list too long )来自 shell,您可以通过将 awk 脚本放在文件中来解决该问题。
    正如他还指出的那样,您的基本方法不是最佳的。下面是两种选择。

    Perl 有许多功能可以帮助您解决这个问题。
    您可以使用 ^两个字符串的异或运算符将返回 \x00字符串匹配的地方和不匹配的另一个字符。通过最长的字符串与较短的字符串进行异或运算,并使用最大替换计数,您将得到:

    use strict;
    use warnings;
    use 5.014;

    my $seq = "CGCCCGAATCCAGAACGCATTCCCATATTTCGGGACCACTGGCCTCCACGGTACGGACGTCAATCAAAT";
    my $pat = "AAAAAA";
    my $max_subs = 3;

    my $len_in = length $seq;
    my $len_pat = length $pat;
    my %posn;

    sub strDiffMaxDelta {
    my ( $s1, $s2, $maxDelta ) = @_;

    # XOR the strings to find the count of differences
    my $diffCount = () = ( $s1 ^ $s2 ) =~ /[^\x00]/g;
    return $diffCount <= $maxDelta;
    }

    for my $i ( 0 .. $len_in - $len_pat ) {
    my $substr = substr $seq, $i, $len_pat;
    # save position if there is a match up to $max_subs substitutions
    $posn{$i} = $substr if strDiffMaxDelta( $pat, $substr, $max_subs );
    }

    say "$_ => $posn{$_}" for sort { $a <=> $b } keys %posn;
    运行此打印:
    6 => AATCCA
    9 => CCAGAA
    10 => CAGAAC
    11 => AGAACG
    13 => AACGCA
    60 => CAATCA
    61 => AATCAA
    62 => ATCAAA
    63 => TCAAAT
    替代:
    $seq=AAATCGAAAAGCDFAAAACGT;
    $pat=AATC;
    $max_subs=1;
    打印:
    1 => AATC
    8 => AAGC
    15 => AAAC
    将其从标准输入或文件转换为“魔术输入”也很容易(与 awk 的风格相同)。

    你也可以用 awk 写一个类似的方法:
    echo "AAATCGAAAAGCDFAAAACGT" | awk -v mc=1 -v seq="AATC" '
    {
    for(i=1; i<=length($1)-length(seq)+1; i++) {
    cnt=0
    for(j=1;j<=length(seq); j++)
    if(substr($1,i+j-1,1)!=substr(seq,j,1)) cnt++
    if (cnt<=mc) print i-1 " => " substr($1,i, length(seq))
    }
    }'
    打印:
    1 => AATC
    8 => AAGC
    15 => AAAC
    与上面更长的示例相同的结果。由于输入被移动到 STDIN(或文件)并且正则表达式不需要很大,这应该让您开始使用 Perl 或 Awk。
    (请注意,字符串的第一个字符在 awk 中的偏移量为 1,在 Perl 中的偏移量为 0...)

    关于regex - awk unix - 匹配正则表达式 - 正则表达式字符串大小限制 |想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67467829/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com