我在一个文件中有以下几行

$ cat test.txt
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0
69|1077822111|2,;tel:+2223120011~sip:+2223120051@vzpps.com;|sip:+13123120022@vzpps.com|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

好的方面是所有文件在第三列和第四列都有一个‘+’.现在困难的部分是,有时我们会得到第一行第三列(121345633210)中注意到的11位数字,有时‘+’后面没有‘1’.因此,如果加号后面有1,则排除1.否则,从‘+’符号后开始长度.同样,如果有11个数字,只有10个子字符串.另外,如果有超过1个数字,比如第2行,我只需要拿起‘+’符号后面的第一个数字,就像2223120011,而不是2223120051.

我try 了以下几种方法

awk -F"|"  'BEGIN {FS="+"}{print substr($3,2,10)}' test.txt

但它为第二行提供的值不正确,因为它需要在‘+’符号之后开始.

推荐答案

当前代码的问题:

  • -F"|"FS="+"都定义了输入字段,所以从技术上讲,你应该 Select 一个或另一个,而不是两个;在这种情况下,FS="+"优先(即,-F"|"被忽略)
  • 由于总体要求是‘替换’第3列和第4列,因此您需要保留前-F"|"列,但也要将其定义为输出字段分隔符(建议:BEGIN { FS=OFS="|"}
  • 然后看看进一步解析第3/第4字段与awk字符串函数的某种组合(例如,split()match()index()substr())

假设/理解:

  • 第3/4字段的值始终为+
  • +后面的字符串始终是10位或11位数字
  • 如果第3/4个字段有多个+,那么我们只对first+感兴趣(例如,我们不必基于telsip进一步解析)
  • 我们似乎正在处理北美的电话号码格式(例如,我们不必担心其他国家的不同电话号码格式)

一个awk个 idea :

awk '
BEGIN { FS=OFS="|" }
      { for (i=3; i<=4; i++) {                         # loop through 3rd and 4th fields
            split($i,a,"+")                            # split on "+"
            d1 = substr(a[2],1,1)                      # get 1st digit after the "+"
            $i = substr(a[2],(d1==1 ? 2 : 1),10)       # redefine ith field based on value of 1st digit
        }
      }
1                                                      # print current line
' test.txt

NOTES:

  • 此逻辑是基于我们只需处理北美电话号码格式(10位/11位,国家代码=1)的假设进行硬编码的

这会产生以下结果:

69|1074330570|2134563321|2134565534|0
69|1077822111|2223120011|3123120022|0
69|1077988012|2151001607|3696533951|0

Linux相关问答推荐

是否有例外情况需要在.gitconfig中使用?

无法下载Centos 7上的存储库的元数据

通过ssh传输参数时避免字符串拆分

通过shell 脚本基于AM/PM对日期时间字段进行排序

AWK打印到文件正在追加,而不是覆盖

boost-iostreams 1.59 sparc-solaris 交叉编译失败

Docker 默认使用交换文件吗?

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

访问证书里面的图片

如何彻底剥离可执行文件

Linux 应用程序分析

如何在 shell 脚本中动态生成新的变量名?

在使用文件时截断文件 (Linux)

如何像 Nautilus 那样从命令行挂载?

PuTTY:更改默认 SSH 登录目录

Linux 的 TextMate 替代品

conda 命令会提示错误:Bad Interpreter: No such file or directory

如何将初始输入通过管道传输到随后将是交互式的进程中?

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

如何制作和应用SVN补丁?