簡體   English   中英

如何使用awk在bash中格式化電話號碼

[英]How to format phone numbers in bash with awk

我正在用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文件中使用我的正則表達式,請多多指教!

聽起來這就是您所需要的:

$ 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|

我可以拉近你。 我發現您的awk腳本有兩個錯誤,在取得更多進展之前,應先糾正它們。 首先,BEGIN語句看起來有誤。 而不是打印substr($ 1,2),它應該只設置IFS和OFS。 您可能已經知道,BEGIN僅執行一次。

同樣,將IFS設置為管道'|'之后,您將需要修改每條輸入行中的第三個字段。 因此,所有gsub調用的目標參數應該為$ 3,而不是$ 1。

好吧,這就是我為您准備的。 我懷疑我看到的其余問題與您的輸出與預期結果不符是您提到的原因-不同的regexp處理。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM