我有一个逗号分隔的CSV文件,该文件将字段括在双引号中,而我试图在bash中对其进行操作。我想从每行的双引号字段中删除逗号。我已经针对此处提出的问题寻找了其他解决方案,它们围绕使用外部库进行CSV解析而展开,对于我的有限环境(大多数工作都是在awk和sed中完成),这不是我的选择。>
"A","B","C D","E, F","G"
所需的输出
"A","B","C D","E F","G"
答案 0 :(得分:1)
易于使用Perl的Text::CSV_XS模块:
perl -MText::CSV_XS=csv -we 'csv(
in => shift,
always_quote => 1,
on_in => sub { tr/,//d for @{ $_[1] } }
);' -- file.csv
in
指定输入,shift仅从命令行参数中获取一个always_quote
甚至将引号添加到不需要引号的字段on_in
引入了要在每行上运行的代码,在这种情况下,它将对音译行tr
中的所有单元格进行迭代并删除逗号。答案 1 :(得分:0)
使用sed,可删除所有逗号后跟一个非引号字符和不带一个非引号字符的逗号:
sed 's/,*\([^"]\)/\1/g;s/\([^"]\),*/\1/g' file
编辑:
添加了*
量词以匹配后续的逗号。
答案 2 :(得分:0)
使用GNU awk和FPAT
:
$ awk '
BEGIN {
FPAT = "([^,]+)|(\"[^\"]+\")" # field definition
OFS="," # output field separator
}
{
for(i=1;i<=NF;i++) # loop all fields
gsub(/,/,"",$i)} # replace all commas in fields
1' file # output
"A","B","C D","E F","G"
答案 3 :(得分:0)
我喜欢将Ruby用于CSV单行格式:
ruby -rcsv -ne '
CSV.parse($_) {|row|
puts row.map {|field| field.delete(",")}
.to_csv(:force_quotes => true)
}
'