我有一个包含两百万行格式的文件:
"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728",D#
最后一个值实际上应该是:
"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728,"D#"
请问,如何使用 sed 命令修复此文件,以便删除虚假的“并且最后一个值被双引号引起来
答案1
您可以尝试以下方法:
sed -r 's/",([^,]*)$/,"\1"/' input-file
那是",
后面跟着任何不是逗号 ( [^,]
) 的内容直到文件末尾$
.\1
是括号中 - 匹配的部分([^,]*)
。
答案2
不过sed
:perl
perl -F, -ane '($f1)=$F[1]=~/(.*)"/; $F[2]=~s/\n//g; print "$F[0],$f1,\"$F[2]\"\n";'
解释:
perl -F, -ane
逐行读取输入,并将行拆分为,
($f1)=$F[1]=~/(.*)"/;
删除"
第二列中的$F[2]=~s/\n//g;
删除末尾的换行符print "$F[0],$f1,\"$F[2]\"\n";
写入输出并将添加"
到最后一个值
编辑-缩短版本(感谢@kos):
perl -F, -lane '$F[1]=~s/"$//; print "$F[0],$F[1],\"$F[2]\"";'
答案3
您的字段似乎由逗号定义。如果是这样,您可以在以下位置执行此操作sed
:
sed -i -r 's/",([^,]*)$/,"\1"/' file
或者,在 Perl 中:
perl -i -lpe 's/",([^,]*)$/,"\1"/' file
在这两种情况下,正则表达式都只是查找逗号,然后查找 0 个或多个非逗号,直到行尾。括号捕获了最后的字段,然后我们可以将其称为\1
($1
在 perl 中为 或 )。然后将其替换为双引号内的自身。用于-i
就地编辑文件,对原始文件进行更改。
您还可以使用awk
:
awk -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file
或者,如果你的版本支持它:
awk -iinplace -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file