桑达。在csv文件中删除包含符号的字段

时间:2014-01-16 22:04:10

标签: regex 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 

印刷

  

&LT; 10.0
  &LT; 0.9

这是我要删除的内容。但

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

不起作用。
我要求 sed 解决方案,因为我对它有点熟悉。但欢迎所有建议。谢谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这个awk one-liner工作,比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 :(得分:2)

按要求使用sed。

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

答案 3 :(得分:0)

awk应该:

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