使用 sed 转换 CSV 文件

mid*_*dus 7 unix csv sed

为了能够将一些数据导入某个工具,我必须从这种格式转换一个 CSV 文件

"data","data","data data","data","123"
Run Code Online (Sandbox Code Playgroud)

变成这种格式

data;data;data data;data;123
Run Code Online (Sandbox Code Playgroud)

列从不包含任何";或者,但可以有空格。目前我使用以下

sed -e 's/","/;/g' -e 's/"//g' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

虽然这很好用,但我想知道这是否可以更优雅地完成,即

  • sed 是适合这项工作的(标准 Unix)工具吗?
  • 是否可以将两个表达式合并为一个?

感谢您的输入!

ayr*_*ieu 6

( tr , ';' | tr -d '"' ) < input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

我会使用 Perl

perl -pe 'tr/,"/;/d' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

-- 但是这个特定的任务并没有超出 sed 的范围。您不能合并这两个表达式。


qua*_*ote 5

您更喜欢哪个(perl、sed、awk)取决于您;他们都会完成工作。既然你要了 sed,而其他人已经发布了,那么你去吧。这是正则表达式的更简单形式,适用于您的示例行:

$ sed -e 's/"//g; s/,/;/g' infile.csv > outfile.csv
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在每次替换后用分号连接这两个表达式。使用 GNU sed v4.1.5 测试。

这是您加入的原始表达式:

$ sed -e 's/","/;/g; s/"//g' infile.csv > outfile.csv
Run Code Online (Sandbox Code Playgroud)

我有理由确定可以合并这两个替换。不确定它会是什么,而且我很确定结果的可读性会比顶部的脚本低得多。如果我想出了什么(或其他人在评论中权衡),我会在这里添加。