2017-10-15 49 views
0

我有一個包含數千行的csv文件。如何在csv文件的特定列中用AWK替換多個字符?

我需要在一個特定的列

&acirc ; ---> a 
&amp ; ---> & 
&eacute ; ---> é 

我用這個命令試圖取代一些字符,但它不工作

awk 'BEGIN{FS=OFS=";"} {for (i=3;i<=NF;i++) gsub("/\&amp\;/","\&",$3); gsub("/\&middot\;/", " ",$3); gsub("/\&acirc\;/", "a",$3); gsub("/\&eacute\;/", "e",$3); gsub(/\#/, " ",$3)}' file.csv 

樣品輸入:

32602;1;"Wet &amp; Dry 5029";2663,2662 

預期輸出:

32602;1;"Wet & Dry 5029";2663,2662 
+2

後從你的'file.csv' – RomanPerekhrest

+1

歡迎的幾個輸入線堆棧溢出,請郵寄樣本輸入和期望的輸出在代碼標籤中(按照論壇規則)。 – RavinderSingh13

回答

0

所以,你想解析一個CSV文件與awk和修改只有一個列的子集?

首先,解析CSV字段並不像在分隔符(,;)上分割那麼簡單,因爲當引用值時必須避免分割。該awk食譜這在excellent answer by @EdMorton,並給出瞭如果使用GNU awk,最簡潔的方法是FPAT:(對於其他awk S和一些特殊情況,請參閱引用答案)

awk -v FPAT='[^;]*|"[^"]+"' -v OFS=';' '...' 

現在回到您的程序。 ERE參數gsub的正確語法是/pattern/"pattern",但不是兩者都是(例如"/pattern/")。

這意味着你將不得不更換如下:

gsub("/\&amp\;/","\&",$3)  --> gsub(/&amp;/, "\\&", $3) 
gsub("/\&middot\;/", " ",$3) --> gsub(/&middot;/, " ", $3) 
gsub("/\&acirc\;/", "a",$3) --> gsub(/&acirc;/, "a", $3) 
gsub("/\&eacute\;/", "e",$3) --> gsub(/&eacute;/, "e", $3) 

還要注意的是,在ERE正則表達式的一部分,&;沒有進行轉義,但在替換字符串&做(與\這也需要逃脫)。

此外,要僅修改列$3,則不需要for循環。但是,如果您確實想要修改從$3開始到最後$NF結束的一系列列,則需要在每個gsub調用中使用$i,而不是$3

固定的,你awk的程序是這樣的:

awk -v FPAT='[^;]*|"[^"]+"' -v OFS=';' '{ 
    for (i=3; i<=NF; i++) { 
     gsub(/&amp;/, "\\&", $i) 
     gsub(/&middot;/, " ", $i) 
     gsub(/&acirc;/, "a", $i) 
     gsub(/&eacute;/, "e", $i) 
     gsub(/#/, " ", $i) 
    } 
    print 
}' file.csv 

(該print末,確保每一行得到打印。)

適用於你的榜樣(並轉化爲一個班輪):

$ echo '32602;1;"Wet &amp; Dry 5029";2663,2662' | awk -v FPAT='[^;]*|"[^"]+"' -v OFS=';' '{for (i=3;i<=NF;i++) {gsub(/&amp;/,"\\&",$i); gsub(/&middot;/," ",$i); gsub(/&acirc;/,"a",$i); gsub(/&eacute;/,"e",$i); gsub(/#/," ",$i)}; print}' 
32602;1;"Wet & Dry 5029";2663,2662 

在評論其他故障排除後,似乎是解決你的問題是不是要取代這些HTML實體因爲您的CSV文件似乎格式不正確,所以後續處理器無法解析它(可能是由於未引用; s),所以請在完整文件中替換它們。

可以代替你像一個簡單的sed命令指定的所有HTML實體:

sed -e 's/&amp;/\&/g' -e 's/&middot;/ /g' -e 's/&acirc;/a/g' -e 's/&eacute;/e/g' -e 's/#/ /g' file 
+0

謝謝你的答案,但不工作。 這裏是我的csv文件的樣本線---> 32602; 1;「溼&幹5029」; 2663,2662 當我申請到CSV文件我仍然有&它不是替換&。 任何想法爲什麼? –

+0

現在看看,問題是在';'上分割,所以你真的需要一個正確的CSV解析。 – randomir

+0

非常感謝您提供非常明確的信息。但實際上,仍然存在問題。 csv編碼不好,這就是爲什麼我想替換這些包含特殊字符的字符「;」和「#」,因爲當我將csv導入數據庫時​​會引發問題。當我應用新的代碼時,現在我在第3列的許多行中找到「;」而不是空間。 –

相關問題