Как отформатировать телефонные номера в bash с помощью awk - PullRequest
0 голосов
/ 25 марта 2019

Я кодирую новый скрипт в bash , чтобы отформатировать номер телефона по французскому стандарту. Почти все сделано, но я не знаю, как изменить значения в файлах CSV.

  1. Технические характеристики:

    • Удалить все нецифровые символы (кроме "+", если находится в первой позиции)
    • Замены:
      • 06xxx -> + 336xxx
      • 07xxx -> + 337xxx
      • + 3306xxx -> + 336xxx
      • + 3307xxx -> + 337xxx
  2. Пример данных (допустимые данные будут в третьем столбце моего CSV-файла с | разделителями):

    ||0612345678|
    ||+33612345678f|
    ||+33712345678|
    ||+330612345678|
    ||+330712345678|
    ||06.12.34.56.78|
    ||06 12 34 56 78|
    ||06d12d34.h*56-78|
    ||+2258475|
    ||+65823|
    
  3. Ожидаемый результат:

    ||+33612345678|
    ||+33612345678|
    ||+33712345678|
    ||+33612345678|
    ||+33712345678|
    ||+33612345678|
    ||+33612345678|
    ||+33612345678|
    ||+2258475|
    ||+65823|
    
  4. Текущее состояние

Я пытался сделать это с помощью sed. Это на самом деле работает с этими выражениями:

    sed -e "s/\b[^0-9]//g" sample > test
    sed -e "s/[a-z]//g" test > test2
    sed -e "s/\b[^0-9]//g" test2 > test3
    sed -e "s/^06/+336/g" test3 > test4
    sed -e "s/^07/+337/g" test4 > test5
    sed -e "s/^+3306/+336/g" test5 > test6
    sed -e "s/^+3307/+337/g" result

НО я не знаю как сделать подстановку в моем файле CSV, только в третьем столбце.

Затем я попытался с помощью awk:

    awk '
    BEGIN {print substr($1,2); }
    {FS=OFS="|"} 
    {   
        gsub("\b[^0-9]","",$1);
        gsub("[a-z]","",$1);
        gsub("\b[^0-9]","",$1);
        gsub("^06","+336",$1);
        gsub("^07","+337",$1);
        gsub("^+3306","+336",$1);
        gsub("^+3307","+337",$1)
    } 1
    ' sample

но awk не понимает всех выражений регулярных выражений. Результат при использовании awk:

    +33612345678|
    +33612345678|
    +33712345678|
    +33612345678|
    +33712345678|
    +336.12.34.56.78|
    +336 12 34 56 78|
    +3361234.*56-78|
    +2258475|
    +65823|

Я бы хотел использовать выражения регулярных выражений непосредственно в моих файлах csv, совет будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Похоже, это все, что вам нужно:

$ cat tst.awk
BEGIN { FS=OFS="|" }
$3 != "" {
    gsub(/[^0-9]+/,"",$3)
    sub(/^(33)?06/,"336",$3)
    sub(/^(33)?07/,"337",$3)
    $3 = "+" $3
}
{ print }

$ awk -f tst.awk file
||+33612345678|
||+33612345678|
||+33712345678|
||+33612345678|
||+33712345678|
||+33612345678|
||+33612345678|
||+33612345678|
||+2258475|
||+65823|
0 голосов
/ 25 марта 2019

Я могу подвести тебя немного ближе.В вашем скрипте awk я обнаружил пару ошибок, которые нужно исправить, прежде чем делать больше.Во-первых, оператор BEGIN выглядит ошибочно.Вместо того, чтобы печатать substr ($ 1,2), он должен просто установить IFS и OFS.Как вы, наверное, уже знаете, BEGIN исполняется только один раз.

Кроме того, как только IFS настроен на канал '|', вам нужно будет изменить третье поле в каждой строке ввода.Таким образом, целевой параметр для всех ваших вызовов gsub должен быть $ 3, а не $ 1.

Ну, это все, что я получил для тебя.Я подозреваю, что остальная часть проблем, с которыми я сталкиваюсь, когда ваш вывод не соответствует ожидаемым результатам, связана с той причиной, о которой вы упомянули, - с другой обработкой регулярных выражений.

awk '
    BEGIN {FS=OFS="|"} 
    {   
        gsub("\b[^0-9]","",$3);
        gsub("[a-z]","",$3);
        gsub("\b[^0-9]","",$3);
        gsub("^06","+336",$3);
        gsub("^07","+337",$3);
        gsub("^+3306","+336",$3);
        gsub("^+3307","+337",$3)
    } 
    1
' sample
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...