从字符串中提取10位数

时间:2014-01-25 14:49:01

标签: sed awk grep

以下命令按预期工作,并向我显示找到10位数字的突出显示结果。

# grep '[0-9]\{10\}' test.csv
0987654321,Raka,Nr Man  Informatics,Bm ,Bangalore,,26 - 12 - 2010
Rajesh  Patel,No 9999 Part Road  Town  Airlines Bangalore Cell-9702977479,Crv,Bangalore,560051,19 - 7 - 2013

我需要做的是将该数字“提取”到行的开头。看起来应该是这样......

0987654321,0987654321,Raka,Nr Man  Informatics,Bm ,Bangalore,,26 - 12 - 2010
9702977479,Rajesh  Patel,No 9999 Part Road  Town  Airlines Bangalore Cell-9702977479,Crv,Bangalore,560051,19 - 7 - 2013

更新

如果没有找到10位数字,那么该行应附加一些虚拟数据,例如: 0000000000(为了一致性目的)

3 个答案:

答案 0 :(得分:4)

使用sed的一种方法:

 sed 's/.*\([0-9]\{10\}\).*/\1,&/' input

给出:

0987654321,0987654321,Raka,Nr Man  Informatics...
9702977479,Rajesh  Patel,No 9999 Part Road  To...

如果找不到10位数,这个将增加10 0:

sed 's/.*\([0-9]\{10\}\).*/\1,&/;/[0-9]\{10\}/!s/^/0000000000,/' input

答案 1 :(得分:2)

将GNU awk用于\>字分隔符:

$ cat file
0987654321,Raka,Nr Man  Informatics,Bm ,Bangalore,,26 - 12 - 2010
Rajesh  Patel,No 9999 Part Road  Town  Airlines Bangalore Cell-9702977479,Crv,Bangalore,560051,19 - 7 - 2013
foo,bar
long,num,12345678901234

$ gawk -v OFS="," '{print (match($0,/[[:digit:]]{10}\>/) ? substr($0,RSTART,RLENGTH) : "0000000000"), $0 }' file
0987654321,0987654321,Raka,Nr Man  Informatics,Bm ,Bangalore,,26 - 12 - 2010
9702977479,Rajesh  Patel,No 9999 Part Road  Town  Airlines Bangalore Cell-9702977479,Crv,Bangalore,560051,19 - 7 - 2013
0000000000,foo,bar
5678901234,long,num,12345678901234

答案 2 :(得分:0)

更好地使用sed

sed 's/\(.*\([0-9]\{10\}\).*$\)/\2,\1/'

现在经过测试和工作。请注意,我有两组捕获组 - 一组围绕整个表达式(这是第一个捕获组,称为\1),另一组(内部)围绕十位数字,参考为\2

如果您只想要“可能长于10”的数字的最后十位数字,您可以

sed 's/\(.*\([0-9]\{10\}\)[^0-9].*$\)/\2,\1/'

确保“10位数之后的下一个数字不是数字(从而找到最后的数字)。”