【问题标题】:How to insert character after 3rd and 5th number with AWK如何使用 AWK 在第 3 个和第 5 个数字之后插入字符
【发布时间】:2015-01-26 15:42:27
【问题描述】:

我有

Andrew 123123
Mick 234234
Steve 345345
Bob 456456

需要出去

Andrew 123-1-23
Mick 234-2-34
Steve 345-3-45
Bob 456-4-56

尝试使用一些正则表达式替换,但不知道如何记住第一个“substr”以将其替换为“substr-”。

【问题讨论】:

  • 必须是awk吗?我会使用sed 's/\(.\)\(..\)$/-\1-\2/'
  • 是的,我需要完全使用 awk =(
  • 您的系统没有sed

标签: regex bash replace awk substring


【解决方案1】:

可能有更适合这项工作的工具,但如果您必须使用awk,您可以使用:

{print $1" "substr($2,1,3)"-"substr($2,4,1)"-"substr($2,5)}

根据以下成绩单:

$ echo 'Andrew 123123
Mick 234234
Steve 345345
Bob 456456' | awk '{print $1" "substr($2,1,3)"-"substr($2,4,1)"-"substr($2,5)}'

Andrew 123-1-23
Mick 234-2-34
Steve 345-3-45
Bob 456-4-56

$ echo 'Andrew 123456
Mick abcdef
Steve 314159
Bob xxxyzz' | awk '{print $1" "substr($2,1,3)"-"substr($2,4,1)"-"substr($2,5)}'

Andrew 123-4-56
Mick abc-d-ef
Steve 314-1-59
Bob xxx-y-zz

【讨论】:

  • 太完美了!还有一个问题,如何仅对 7 个长度的数字进行替换?
  • @Orion,这可能应该在您的原始问题或其他问题中,但那是您使用过滤器的时候,类似于:awk 'length($2)==7{print ...}'。请记住,您的示例数据的长度为 6。
  • 在这种情况下,只会打印更改的行
  • 终于是awk 'length($2)!=7{print} length($2)==7{print $1" "substr($2,1,3)"-"substr($2,4,2)"-"substr($2,6)}' awk
  • @Orion awk 'length($2)==7{$2=substr($2,1,3)"-"substr($2,4,1)"-"substr($2,5)}1'
【解决方案2】:

如果你可以使用 perl(好吧,好吧它等于 sed,并且 \cite{@Beta} 已经告诉我们如何做到这一点:)...

perl -pe 's/\b(\d{3})(\d)(\d{3})\b/$1-$2-$3/g'

你需要根据你的长度调整数字...

测试:

使用前面的例子 \cite{@paxdiablo}

$ echo 'Andrew 123456
Mick abcdef
BBB 12345
Steve 314159
Bob xxxyzz' | perl -pe 's/\b(\d{3})(\d)(\d{2})\b/$1-$2-$3/g'

Andrew 123-4-56
Mick abcdef
BBB 12345
Steve 314-1-59
Bob xxxyzz

【讨论】:

    【解决方案3】:

    这确实是 sed 的工作,因为它只是单行的简单替换,但这里是 GNU awk 对一个修改过的输入文件,其中包含几个 7 位数的第二个字段加上一个 6 和一个 8:

    $ cat file
    Andrew 1231239
    Mick 234234
    Steve 3453457
    Bob 45645623
    $
    $ awk '{$2=gensub(/^(...)(.)(...)$/,"\\1-\\2-\\3","",$2)}1' file
    Andrew 123-1-239
    Mick 234234
    Steve 345-3-457
    Bob 45645623
    

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2015-06-09
      • 2014-06-10
      • 2020-06-18
      • 2018-09-11
      相关资源
      最近更新 更多