sed 命令是什么来修复此文件,以便每行的最后一个值都用双引号引起来

sed 命令是什么来修复此文件,以便每行的最后一个值都用双引号引起来

我有一个包含两百万行格式的文件:

"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

不过sedperl

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 

相关内容