#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
опция работает, это означает, что будут напечатаны только совпадающие строки.