Команда для печати телефонных номеров, выделив код города (первые 3 цифры телефонных номеров), заключив их в круглые скобки

#regex #awk #sed #formatting #phone-number

#регулярное выражение #awk #sed #форматирование #номер телефона

Вопрос:

Обратите внимание, что в файле могут быть некоторые записи, в которых отсутствует имя и есть только номер телефона, или наоборот.Такие записи следует рассматривать как недопустимые записи и не следует отображать в выходных данных.Even не следует выводить пустую строку в выходных данных для этих записей.

Пример ввода:

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

вывод:

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

MyCode:

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

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

   

}
  

Я преодолел всего 1/4 мили.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее. Написано и протестировано в https://ideone.com/ZMnuIp ссылка только на показанные образцы.

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

Объяснение: Условие проверки, если NF равно 2, означает, что строка содержит 2 поля, а 2-е поле начинается с 3 цифр, тогда выполните следующее. Печать (затем подстрока из 3 цифр 2-го поля, затем печать) и остальная часть строки.

Ответ №2:

С помощью GNU awk. Проверьте с помощью регулярного выражения ( ^[0-9] $ ), содержит ли второй столбец только цифры, выведите второй столбец:

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

Вывод:

5555551212
5555551213
5555551214
6665551215
6665551216

Отформатируйте второй столбец с помощью substr:

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

Вывод:

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

Ответ №3:

Это может сработать для вас (GNU sed):

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

Отключите неявную печать -n .

При сопоставлении действительного телефонного номера обведите первые 3 цифры скобками и печатайте только номер.


Решение состоит из одной команды подстановки в форме s/LHS/RHS/ , где RHS / LHS обозначает правую / левую сторону.

LHS — это регулярное выражение, которое соответствует чему-либо в пространстве шаблонов, буфере, куда помещается текущая строка после удаления ее новой строки.

RHS — это место, где размещается замена того, что соответствует в LHS.

/ ‘s являются разделителями команды подстановки, обычно используется / , но это может быть практически любой другой символ, например # , : или %

Регулярное выражение состоит из ^S s([0-9]{3})([0-9] )$

^ представляет место в начале строки, и аналогично $ представляет место в конце строки.

S представляет собой символ без пробела, двойственный символ s , который представляет собой пробел, например, пробел или табуляцию.

Представляют один или несколько предыдущих символов (или группу), * почти одинаковы, за исключением того, что они представляют ноль или более, ? представляют необязательный (ноль или единица) и {3} представляют ровно 3. So x{3} совпадает с xxx .

(...) представляет группу, где ... могут быть буквенные символы, классы символов, группы, чередования, обратные ссылки или их комбинации. К группе можно обратиться позже, либо в LHS, либо в RHS команды подстановки, они пронумерованы 1 по 9 , слева направо, таким образом, (abc)11 представляет abcabcabc .

[0-9] Символьный класс цифр здесь 0 через 9 .

Таким образом, LHS означает: начиная с начала строки, за ней следует один или несколько символов, не содержащих пробелов, за которыми следует символ пробела, за которым следует группировка ( 1 ) из 3 цифр, за которой следует группировка ( 2 ) из одной или нескольких цифр, за которой следует конец строки.

RHS представляет: литерал ( , за которым следует первая группа, то есть первые 3 цифры телефонного номера, за которыми следует литерал ) , за которым следует вторая группа, то есть оставшиеся цифры телефонного номера.

Если подстановка прошла успешно, результат подстановки затем выводится в стандартный вывод, поскольку присутствует p флаг. Поскольку -n опция работает, это означает, что будут напечатаны только совпадающие строки.