如何在csv文件中替换管道而不是逗号

时间:2015-06-02 07:35:30

标签: awk sed grep

我想将逗号分隔的csv文件转换为pipe(|)。但是在csv文件中,一些行也应该有逗号,

我的档案

$ cat a.txt
"a","b","c,test","new","abc"

期待:

a|b|c,test|new|abc

5 个答案:

答案 0 :(得分:1)

这个sed命令将执行:

sed 's/","/\|/g; s/"//g' File

将所有","模式替换为|。这将在两端都有",稍后会删除。

<强>示例:

AMD$ cat File
"a","b","c,test","new","abc"

AMD$ sed 's/","/\|/g; s/"//g' File
a|b|c,test|new|abc

答案 1 :(得分:1)

sed ':cycle
s/^\(\("[^"]*"[|]\{0,1\}\)*\),/\1|/
t cycle' YourFile
  • 递归posix版本。
  • [|]\{0,1\}的快捷方式,假设没有"foo"|,"foo",,(空字段为""
  • 这里的另一个假设是,引用的字符串里面没有双引号(甚至是转义的)

答案 2 :(得分:1)

CSV手动操作非常棘手。我会使用带有正确CSV解析器的语言。例如,使用ruby:

$ ruby -rcsv -ne 'puts CSV.generate_line(CSV.parse_line($_), :col_sep=>"|")' a.txt
a|b|c,test|new|abc

循环遍历文件的行,使用默认值(逗号分隔,双引号作为引号字符)将其解析为数组,然后使用管道作为分隔符生成新的CSV字符串。如果某个字段包含管道符,则会引用该字段。

此解析器无法处理带引号的字段中的嵌入换行符。 Perl的Text::CSV可以。

答案 3 :(得分:1)

$ awk -F'","' -v OFS='|' '{$1=$1; gsub(/"/,"")} 1' a.txt
a|b|c,test|new|abc

答案 4 :(得分:0)

您可以通过以下方式使用perl:

a:hover {
    color: whatever color you want;
}