Sed 从字符串中提取10位数字

Sed 从字符串中提取10位数字,sed,awk,grep,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 我需要做的是将该数

下面的命令按预期工作,并向我显示高亮显示的结果,其中找到了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(为了一致性目的)

使用sed的单向:

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

如果找不到10位数字,此项将添加10个0:

sed 's/.*\([0-9]\{10\}\).*/\1,&/;/[0-9]\{10\}/!s/^/0000000000,/' input
使用sed的一种方法:

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

如果找不到10位数字,此项将添加10个0:

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

更好地使用sed
sed

sed 's/\(.*\([0-9]\{10\}\).*$\)/\2,\1/'
现在测试和工作。请注意,我有两组捕获组—一组围绕整个表达式(这是第一个捕获组,称为
\1
),另一组(内部)围绕十位数,称为
\2

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

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

这确保了“10位数字后的下一个不是数字(因此会找到最后10位)。

最好使用
sed

sed 's/\(.*\([0-9]\{10\}\).*$\)/\2,\1/'
现在已测试并开始工作。请注意,我有两组捕获组-一组围绕整个表达式(这是第一个捕获组,称为
\1
),另一组(内部)围绕十位数,称为
\2

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

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

它确保“10位数字后的下一个不是数字(因此找到最后10位)。

使用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

将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

您是否需要
grep-o
仅返回匹配项?你真的想重复这个数字吗?应该在开始时重复这个数字,这样我就可以使用数据库处理它。你的文件是否可以包含,比如说,一个11位数的数字,如果是的话,应该如何处理它-忽略或将其视为10位数,或者截断为10位数,或者…?右边是10位数。通常前2个是国家代码,如果数字>10 OK,请参阅我的更新答案。你对elsethread的电子邮件评论怎么样?您应该更新示例输入和预期输出,以包括该输入和任何其他边缘情况。是否需要
grep-o
仅返回匹配?你真的想重复这个数字吗?应该在开始时重复这个数字,这样我就可以使用数据库处理它。你的文件是否可以包含,比如说,一个11位数的数字,如果是的话,应该如何处理它-忽略或将其视为10位数,或者截断为10位数,或者…?右边是10位数。通常前2个是国家代码,如果数字>10 OK,请参阅我的更新答案。你对elsethread的电子邮件评论怎么样?您应该更新示例输入和预期输出,以包括该输入和任何其他边缘情况。是。这是正确的。我刚刚注意到数据中也有电子邮件,应该在单元格编号后加逗号或管道。可能吗?是的。这是正确的。我刚刚注意到数据中也有电子邮件,应该在单元格编号后加逗号或管道。可能吗?不可能。它有几个错误。不是转义括号,也不是大括号。在替换零件中没有使用两组,在找到十位数之前,您需要一个量词。类似这样的内容将更加接近:
sed的/^\(.*\\)\([0-9]\{10\}\)/\2、\1\2/'
@birei-感谢您的反馈。你是对的。修复现在(不完全是你的方式,但测试和工作)不完全。它有几个错误。不是转义括号,也不是大括号。在替换零件中没有使用两组,在找到十位数之前,您需要一个量词。类似这样的内容将更加接近:
sed的/^\(.*\\)\([0-9]\{10\}\)/\2、\1\2/'
@birei-感谢您的反馈。你是对的。现在已修复(不完全是您的方式,但经过测试和工作)