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

时间:2014-11-28 01:55:19

标签: regex bash replace awk substring

我有

Andrew 123123
Mick 234234
Steve 345345
Bob 456456

需要出去

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

尝试使用一些正则表达式替换,但不要知道如何记住fisrt" substr"将其替换为" substr - "。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你可以使用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

答案 2 :(得分:0)

这真的是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