我有一个很大的 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
:打印记录