通过用括号将区号(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 的数字 0
到 9
。
所以 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,然后打印),然后是该行的其余部分。
备注 文件中可能有一些记录缺少名称,只有 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 的数字 0
到 9
。
所以 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,然后打印),然后是该行的其余部分。