【问题标题】:Awk split string into words and numbersawk 将字符串拆分为单词和数字
【发布时间】:2021-03-23 23:49:17
【问题描述】:

我正在尝试拆分字母和数字边界,但使用环视的解决方案失败了:

echo 50cats30dogs100squirrels | awk '{split($0,a,/(?<=\D)(.*)(?=\d)/); print a[1],a[2],a[3]}'

awk: illegal primary in regular expression (?<=\D)(.*)(?=\d) at <=\D)(.*)(?=\d)
 source line number 1
 context is
     >>> {split($0,a,/(?<=\D)(.*)(?=\d)/) <<<

有没有办法在 Awk 中以其他方式做到这一点?

编辑:

抱歉,不清楚。预期的输出是像这样添加空格:

50 cats 30 dogs 100 squirrels

【问题讨论】:

  • 你可以看看this question。总而言之,awk 没有后视正则表达式。
  • awk 不支持环顾四周,如果您可以在您的问题中发布您的示例输入和示例输出,那么我们可以获得更清晰的图片,并可以在这里提供帮助,谢谢你。
  • 数组a之后应该包含什么?我不知道你想要数字还是单词。
  • 关于您的编辑:什么? 50cats30dogs100squirrels -> 50 cats 30 dogs 100 squirrels 实际上是 2S5M1I^ATAG1I3M1D5M -> SSMMMMMI^^^^IMMMDMMMMM?
  • 我认为这是一个解决更复杂问题的玩具示例(或前进的一步)。将发布一个新问题。

标签: awk


【解决方案1】:

仅使用您展示的样品。如果这是您正在寻找的内容,请尝试以下操作。在 GNU awk 中编写和测试(我相信应该可以在任何 awk 中工作)。

echo "50cats30dogs100squirrels" | awk '{gsub(/[^0-9]+/," & ")} 1'

所示样本的输出如下:

50 cats 30 dogs 100 squirrels

【讨论】:

    【解决方案2】:

    有没有办法在 Awk 中以其他方式做到这一点?

    我会使用 GNU AWK 来完成这个任务,让 file.txt 内容成为

    50cats30dogs100squirrels
    

    然后

    awk 'BEGIN{FPAT="([[:alpha:]]+)|([[:digit:]]+)"}{$1=$1;print}' file.txt
    

    输出

    50 cats 30 dogs 100 squirrels
    

    解释:我使用FPAT 指示 AWK 该列是(一个或多个字母)或(一个或多个数字)。然后我做$1=$1 导致字符串重建(没有$1=$1; 输出将与输入相同)和print 它。

    (在 gawk 4.2.1 中测试)

    【讨论】:

    【解决方案3】:

    (?&lt;=\D)(.*)(?=\d) 是一个 PCRE。 POSIX 标准定义的强制 Unix 工具不支持 PCRE。 awk 特别支持 ERE。

    使用 GNU awk 进行 FPAT:

    $ echo '50cats30dogs100squirrels' | awk -v FPAT='[0-9]+|[^0-9]+' '{$1=$1}1'
    50 cats 30 dogs 100 squirrels
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      echo 50cats30dogs100squirrels | awk '{while (match($0, /[0-9]+|[a-zA-Z]+/)) {print substr($0, RSTART, RLENGTH);$0=substr($0, RSTART+RLENGTH)}}'
      
      

      产量:

      50
      cats
      30
      dogs
      100
      squirrels
      
      

      【讨论】:

        【解决方案5】:

        使用 gawk,这是 gensub 的工作,然后将 split 放入数组更容易:

        gawk '
          BEGIN {
            s = "50cats30dogs100squirrels"
            t = gensub(/[[:alpha:]]+|[[:digit:]]+/, "& ", "g", s)
            print ">" t "<"
            split(t, a)
            for (i in a) print i, a[i]
          }
        '
        

        输出

        >50 cats 30 dogs 100 squirrels <
        1 50
        2 cats
        3 30
        4 dogs
        5 100
        6 squirrels
        

        【讨论】:

          猜你喜欢
          • 2011-06-12
          • 1970-01-01
          • 2011-10-23
          • 2014-06-09
          • 2017-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          相关资源
          最近更新 更多