2014-01-16 62 views
1

我有一個大的.csv文件看起來像這樣:Sed。在csv文件的空白字段包含符號

ABC,10,< 10.0,10.0,ABC
ABC,< 0.9,10,10.0, ABC

我需要刪除包含「<」的字段。有時它只是「<」和數字,有時它包含空格,它可以出現在任何列上。這是我在尋找的輸出:

ABC,10,10.0,ABC
ABC,10,10.0,ABC

的最接近成功了我是

grep -oP '(?<=,)(<.*?)(?=,)' text.csv 

印刷

<
.0 10 < 0.9

這就是我想要刪除的。但是

sed -i 's/(?<=,)(<.*?)(?=,)/ /g' text.csv 

不起作用。
我要求sed解決方案,因爲我對它有點熟悉。但所有建議都是值得歡迎的謝謝!

回答

4

使用SED:

sed 's/[^,]*<[^,]*//g' file 

用awk

awk '{for (i=1;i<=NF;i++) if ($i~/</) $i=""}1' FS=, OFS=, file 

ABC, 10,, 10.0, ABC 
ABC,, 10, 10.0, ABC 
+0

+1我喜歡它,當給出多個建議,尤其是當OP是開放的建議。 – alvits

2

這個awk單線程工作,比sed更直接。

awk -F, -v OFS="," '{for(i=1;i<=NF;i++)if($i~/</)$i=""}7' file 

測試

kent$ echo "ABC, 10, <10.0, 10.0, ABC 
ABC, < 0.9, 10, 10.0, ABC"|awk -F, -v OFS="," '{for(i=1;i<=NF;i++)if($i~/</)$i=""}7' 
ABC, 10,, 10.0, ABC 
ABC,, 10, 10.0, ABC 
2

的要求使用sed的。

sed 's/[ ]*<[^,]*//g' 
+1

如果'<'位於第一列 – BMW

+0

,那麼它是行不通的。我會相應地修改它。 – alvits

+1

既然''''''之間只有一個空格,你可以刪除它們,所以這也可以工作:'sed's/* <[^,] * // g'' – Jotne

0

awk應該做的:

awk '{gsub(/ ?< ?[^,]*/,x)}8' text.csv 
ABC, 10,, 10.0, ABC 
ABC,, 10, 10.0, ABC 
相關問題