我在一个文件中有以下几行
$ cat test.txt
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0
69|1077822111|2,;tel:+2223120011~sip:[email protected];|sip:[email protected]|0
69|1077988012|1,sip:+121510016070x3Bverstat=TN-Validation-Passed|tel:+136965339510x3Bnpd|0
字符串
我想替换文件中的第三和第四列只是电话号码如下:
69|1074330570|2134563321|2134565534|0
69|1077822111|2223120011|3123120022|0
69|1077988012|2151001607|3696533951|0
型
好的一面是所有的文件在第三和第四列都有一个“+”。现在困难的一面是有时我们会在第一行第三列看到11位数字(121345633210)有时候“+”后面没有“1 ",所以如果加号后面有1,就排除1,否则,从“+”号后开始长度。同样,如果有11位数字,只需子串10。此外,如果有多于1个数字,如第2行,我需要选择“+”号后的第一个数字,如2223120011,而不是2223120051。
我尝试了以下方法
awk -F"|" 'BEGIN {FS="+"}{print substr($3,2,10)}' test.txt
型
但是它为第二行提供了不正确的值,因为它需要在“+”符号之后开始。
4条答案
按热度按时间ovfsdjhp1#
您可以使用此
awk
解决方案:字符串
mf98qq942#
当前代码的问题:
-F"|"
和FS="+"
都定义了输入字段,所以,从技术上讲,你应该选择一个或另一个,而不是两个;在这种情况下,FS="+"
优先(即,-F"|"
被忽略)-F"|"
,但也要将其定义为输出字段x1(推荐:BEGIN { FS=OFS="|"}
awk
字符串函数(例如,split()
,match()
,index()
,substr()
)假设/理解:
+
+
后面的字符串始终为10位或11位数字+
,那么我们只对 * 第一个 *+
感兴趣(例如,我们不必根据tel
或sip
进一步解析)一个
awk
的想法:字符串
注意:
这将产生:
型
h5qlskok3#
使用GNU awk for
gensub()
:字符串
或使用任何awk:
型
nhjlsmyf4#
使用您所展示的示例,请尝试以下GNU
awk
代码。字符串
awk
的match
函数在其中使用正则表达式,它创建捕获组,稍后我们可以使用它们来获取所需的输出。match
函数中使用正则表达式^([^|]*\|[^|]*\|)[^+]*\+1*([0-9]+)[^|]*(\|)[^+]*\+1*([0-9]+)[^|]*(\|.*$)
。0
,在这里使用sub
。