1、問題舉例
有時(shí)候,文本文件中的數(shù)量、金額等數(shù)字會用千分位隔開,例如下面的例子file.csv,營收字段用千分位分隔,并用雙引號括起來,表示這是一個字段的數(shù)據(jù),避免跟其他字段混淆:
月份,企業(yè),員工數(shù),營收,利潤
201901,企業(yè)A,1500,"1,234,567.89",400
201902,企業(yè)B,300,900.01,100
當(dāng)金額沒有超過1000時(shí),就不存在千分位,也沒有雙引號。
那么,我們就不能簡單的用awk -F"," 來指定逗號為分隔符對文件進(jìn)行處理,因?yàn)閍wk不能區(qū)分千分位和逗號分隔符。
推而廣之,問題就是我們?nèi)绾稳コp引號中間的逗號。
2、處理方法
因?yàn)槲募杏械男杏须p引號,有的行沒有雙引號,所以我們先處理帶雙引號的行。
處理的關(guān)鍵是把雙引號作為字段分隔符,這樣我們就可以把兩個雙引號中間部分的字符串提取出來,并利用gsub函數(shù)把逗號全部替換為空。
命令:
awk -F"\"" '/".*"/ {gsub(",","",$2); print $1$2$3}' file.csv
輸出:
201901,企業(yè)A,1500,1234567.89,400
說明:
awk -F"\"" 是指定雙引號為分隔符
/".*"/ 是用正則表達(dá)式匹配有兩個雙引號的行
gsub(",","",$2) 是把兩個雙引號中間的字符串中的逗號全部替換為空
不帶雙引號的行直接輸出即可,完整命令如下:
awk -F"\"" '! /".*"/ {print $0} /".*"/ {gsub(",","",$2); print $1$2$3}' file.csv
注意,這里要把不帶雙引號的部分 ! /".*"/ {print $0} 原樣輸出放在前面處理,原因是gsub函數(shù)處理后$0中的雙引號就沒有了,會導(dǎo)致重復(fù)匹配。