Regex 如何使用AWK在第3和第5个数字后插入字符

Regex 如何使用AWK在第3和第5个数字后插入字符,regex,bash,replace,awk,substring,Regex,Bash,Replace,Awk,Substring,我有 需要退出吗 Andrew 123123 Mick 234234 Steve 345345 Bob 456456 尝试使用一些正则表达式替换,但不知道如何记住第一个“substr”将其替换为“substr-”可能有更适合此工作的工具,但是,如果必须使用awk,可以使用: Andrew 123-1-23 Mick 234-2-34 Steve 345-3-45 Bob 456-4-56 根据以下记录: {print $1" "substr($2,1,3)"-"substr($2,4,1)"

我有

需要退出吗

Andrew 123123
Mick 234234
Steve 345345
Bob 456456

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

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

Andrew 123-1-23
Mick 234-2-34
Steve 345-3-45
Bob 456-4-56
根据以下记录:

{print $1" "substr($2,1,3)"-"substr($2,4,1)"-"substr($2,5)}
如果您可以使用perl(好的,好的,它等于sed,并且\cite{@Beta}已经告诉我们如何做:)

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

测试:

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

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

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

$ 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

它必须是awk吗?我会使用
sed的/\(.\)\(..\)$/-\1-\2/”
Ya,我需要使用awk=(您的系统没有
sed
?这太完美了!还有一个问题,如何将替换应用到只有7个长度的数字?@Orion,这可能应该出现在您最初的问题中,或者是另一个问题中,但这时您会使用过滤器,大致如下:
awk'length($2)==7{print…}“
。请记住,您的示例数据的长度为6。在这种情况下,只会打印更改的行。最后,它是
awk'长度($2)!=7{print}长度($2)==7{print$1”“substr($2,1,3)”-“substr($2,4,2)”-“substr($2,6)}awk
@Orion
awk'长度($2)==7{$2=substr($2,1,3)”-“substr
$ 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
$ 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