2017-03-02 46 views
1

下面是一個示例數據。請注意,此操作需要在具有數百萬條記錄的文件上完成,因此我需要最佳方法。本質上,我們正在尋找更新第二列的第四列的前兩個字符的連接,並且不包括第二列的前三個字段('_'分隔)。如何使用awk轉換具有多個分隔符的csv文件

我一直在嘗試使用剪切和逐行讀取文件,這是非常耗時的。我需要AWK一些類似

awk -F, '{print $1","substr($4,1,2)"_"cut -f4-6 -d'_'($2)","$3","$4","$5","$6}' 

輸入數據:

234234234,123_33_3_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,123_11_2_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,123_33_3_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,123_33_3_11111_qewf_mkhsdf,01,09_68645,43234532,2 

輸出要求爲:

234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2 
+0

請編輯你的問題與你的企圖,以及有關哪裏出錯的任何細節。評論部分不適合這些信息。 –

+0

另外,你確定'awk'對於這個特別有效嗎?比起類似Python的腳本解決方案? –

+0

我更喜歡awk,因爲我們沒有在需要轉換這些數據的服務器上安裝python。請注意最大的文件需要這種變換是75 Gb –

回答

2

您可以對線重新格式化AWK和printf

awk -F"[,_]" '{ 
    printf "%s,%s_%s_%s_%s,%s,%s_%s,%s,%s\n", $1,$9,$5,$6,$7,$8,$9,$10,$11,$12 
}' file 

你得到,

 
234234234,06_11111_asdf_asadfas,01,06_1234,4325325432,2 
234234234,07_234111_aadsvfcvxf_anfews,01,07_4444,423425432,2 
234234234,08_11111_mlkvffdg_mlkfgufks,01,08_2342,436876532,2 
234234234,09_11111_qewf_mkhsdf,01,09_68645,43234532,2 
+1

非常感謝!它完美的作品! –

+0

這對**通用** CSV文件不起作用。例如,如果某個字段本身包含逗號(以CSV格式),則可以通過將其用引號括起來進行書寫,例如'....,「abc,def」,...「,awk程序也會分裂這個逗號。順便說一句,您發佈的標題具有誤導性:您沒有多個分隔符,但只有一個(逗號)。事實上,如果您有多個分隔符,則不再將其視爲CSV格式。 – user1934428

+0

@ user1934428我同意你的格式,比如'xml','json','html','csv'等,我建議使用專門的解析器工具 –

相關問題