从一个非常大的 csv 文件中删除“_”

从一个非常大的 csv 文件中删除“_”

我有一个很大的 csv 文件(120GB),如下所示:

"JE",865438083645,2012-12-05T23:07:36.000Z,24,"NQ",142,"658_55525",475035504705
"JE",875619112765,2012-12-05T23:58:04.000Z,4,"PG",144,"219_9221",835399289335
"JE",125495251245,2012-12-05T18:16:06.000Z,206,"PLJE",153,"763_60771",445355650435

我想从第七列的值中删除下划线和引号(例如,"658_55525"变为65855525)。我使用的数据库导入工具不允许在导入时转换或操作文件。

从命令行执行此操作的有效方法是什么?

答案1

我不知道效率如何,但 sed 可以用正则表达式。请备份文件以防输入错误,但也许是这样的:

sed -i  's/"\([0-9]\+\)_\([0-9]\+\)"/\1\2/' bigcsvfile.csv

编辑:删除了 g,正如 kos 指出的那样,不需要 g。

答案2

在编辑大文件时,Perl 无疑是​​最快的。

perl -pi.bak -e 's/"([0-9]+)_([0-9]+)"/$1$2/' your_file.csv

您的备份文件位于

your_file.csv.bak

没有备份:

perl -pi -e 's/"([0-9]+)_([0-9]+)"/$1$2/' your_file.csv

答案3

由于您的文件很大,我建议使用gawk>4.10.0而不是awk,它支持就地编辑。

使用gawk> 4.10.0

gawk -i inplace 'BEGIN {FS=","; OFS=","}; {gsub(/["_]/,"",$7); print}' inputfile
  • -i inplace:指示gawk就地编辑文件

awk脚本分解:

  • BEGIN {FS=","; OFS=","}:将字段分隔符和输出字段分隔符设置为,
  • gsub(/["_]/,"",$7):将记录第 7 个字段中包含的"和字符替换为空字符串_
  • print:打印记录

相关内容