通过用括号将区号(phone 号码的前 3 位数字)突出显示来打印 phone 号码的命令

Command to print the phone numbers by making the area code(the first 3 digits of the phone numbers) prominent by surrounding them by parentheses

备注 文件中可能有一些记录缺少名称,只有 phone 编号,或者 vice-versa.Such 记录应被视为无效记录,不应显示在输出中。甚至不应该在这些记录的输出中添加空白行。

示例输入:

Danish 5555551212
3456782
Bulbul 5555551213
Kaloana 5555551214
Tina 6665551215
Cj
Mayuri 6665551216

输出:

(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216

我的代码:

BEGIN {FS=" ";c=0;}
{   
    if(NF>1)
    {
      s[c]=;
    c=c+1
    }
}

END{
  for (i=0;i<c;i++)
  {
    print s[i] 
  }

   

}

这只是我到达的 1/4 英里。

使用 GNU awk。如果第二列仅包含数字,请使用正则表达式 (^[0-9]+$) 检查,打印第二列:

awk '~/^[0-9]+$/{print }' file

输出:

5555551212
5555551213
5555551214
6665551215
6665551216

将第二列格式化为 substr:

awk '~/^[0-9]+$/{print "(" substr(,1,3) ")" substr(,4)}' file

输出:

(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216

这可能对你有用(GNU sed):

sed -nE 's/^\S+\s([0-9]{3})([0-9]+)$/()/p' file

关闭隐式打印 -n

在匹配一个有效的 phone 号码时,用括号将前 3 位数字括起来并只打印号码。


解决方案包含一个替换命令,形式为 s/LHS/RHS/,其中 RHS/LHS 代表 right/left 手边。

LHS 是与模式 space 中的内容匹配的正则表达式,当前行在其换行符被删除后放置的缓冲区。

RHS 是替换 LHS 匹配项的地方。

/ 是替换命令的分隔符,通常使用 / 但它几乎可以是任何其他字符,例如#:%

正则表达式或正则表达式由^\S+\s([0-9]{3})([0-9]+)$

组成

^代表行首,同样$代表行尾。

\S 表示 non-white space 字符,它是 \s 的对偶,表示白色 space 字符,例如一个 space 或制表符。

+表示一个或多个前面的字符(或组),*几乎相同,只是它表示零个或多个,?表示可选(零或一个) 而 {3} 恰好代表 3。因此 x{3}xxx.

相同

(...) 表示一个组,其中 ... 可以是文字字符、字符 classes、组、交替、反向引用或这些的组合。该组可以在后面引用,在替换命令的 LHS 或 RHS 中,它们从左到右编号为 </code> 到 <code>,因此 (abc) 表示 abcabcabc .

[0-9] 是字符 class 的数字 09

所以 LHS 的意思是:从行首开始跟着一个或多个 non-white spaces 个字符,接着是一个白色的 space 字符,接着是一个3 位数字的分组 (</code>),然后是一位或多位数字的分组 (<code>),然后是行尾。

RHS 表示:文字 (,后跟第一组,即 phone 数字的前 3 位,后跟文字 ),然后是第二组分组,即 phone 号码的剩余数字。

如果替换成功,则替换结果将打印到标准输出,因为存在 p 标志。由于 -n 选项正在运行,这意味着只会打印匹配的行。

能否请您尝试以下。在 https://ideone.com/ZMnuIp link 中编写和测试,仅显示示例。

awk '
NF==2 && match(,/^[0-9]{3}/){
  print "(" substr(,RSTART,RLENGTH) ")" substr(,RSTART+RLENGTH)
}
' Input_file

解释: 检查条件如果 NF 为 2 表示行是否有 2 个字段且第二个字段以 3 位数字开头然后执行以下操作。打印(然后是第 2 字段的 3 位数字的 sub-string,然后打印),然后是该行的其余部分。