使用bash工具转换.csv

时间:2012-12-13 03:14:12

标签: bash csv sed awk

德语版的Origin [TM]将.csv文件保存得很奇怪。但是我有很多这些.csv文件,并希望用脚本转换它们。

A,B
Independent variable,comment1 
"0,4","0,067"
"0,0","0,08"
"0,07","0,02"
"0,09","0,00"

应该成为

A,B
# Independent variable,comment1 
0.4,0.067
0.0,0.08
0.07,0.02
0.09,0.00

Origin的评论定义似乎是

  

这是第二行

5 个答案:

答案 0 :(得分:4)

如果您的csv文件有结构,并且Kevin的上述评论是正确的,那么您可以使用ranges by line number

sed '2s/^/# /; 3,$s/"\([^,]*\),\([^,]*\)"/\1.\2/g' file

或略短的方式:

sed '2s/^/# /; 3,$s/,/./g;s/"."/,/g;s/"//g' file

结果:

A,B
# Independent variable,comment1 
0.4,0.067
0.0,0.08
0.07,0.02
0.09,0.00

答案 1 :(得分:2)

使用sed,假设注释行包含单词comment

sed 's/"\([0-9]*\),\([0-9]*\)"/\1.\2/g;/comment/{s/^/#/}' input

假设评论遵循单个大写字母变量名称:

sed 's/"\([0-9]*\),\([0-9]*\)"/\1.\2/g;/^[A-Z],/{n;s/^/#/}' inpu

答案 2 :(得分:2)

如果你喜欢简单的解决方案,请点击这里:

$ cat tst.awk
BEGIN{FS="\",\""; OFS=","}
NR == 2 { $0 = "# " $0 }
NR >= 3 {
   for (i=1;i<=NF;i++) {
      sub(/\"/,"",$i)
      sub(/,/,".",$i)
   }
}
{ print }

$ awk -f tst.awk file
A,B
# Independent variable,comment1
0.4,0.067
0.0,0.08
0.07,0.02
0.09,0.00

“NR”是行号,“NF”是当前行上"," - 分隔字段的数量。我想,其余的应该是显而易见的,即使你不懂awk。

答案 3 :(得分:1)

perl -pe 's/\"//g;if($.==2){s/^/#/g;}' your_file

如果您想进行现场更换:

perl -pi -e 's/\"//g;if($.==2){s/^/#/g;}' your_file

AWK:

awk '{gsub(/\"/,"");if(NR==2)$0="#"$0;print}' your_file

答案 4 :(得分:0)

另一种解决方案:

awk -F\" '{$1=$1; gsub(/0,/,"0."); gsub(/ /,""); if(NR==2) printf "%s ", "#"}1' file