找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12377|回复: 5

gawk替换\字符问题

[复制链接]
发表于 2018-9-27 00:57:11 | 显示全部楼层 |阅读模式
本帖最后由 shootman2 于 2018-9-27 12:57 编辑

工作中遇到这么一个问题。将一个文本文件中的数据通过mysql的load命令加载到mysql数据库中,
使用命令加载后,没报任何错误。但是在对数据进行查询操作的时候,发现有些数据加载是错位的。
仔细分析后发现,是因为分隔符前面有个转义符导致分隔符不起作用
例如:
文本内容:
aaa\|bbb|ccc|ddd

加载后结果为:
AAA         BBB     CCC   DDD
aaa|bbb   ccc       ddd    NULL

起初,我的解决方法是将 \ 字符替换成 \\ ,加载后就正常了。但是文件体积巨大,有3个G左右。
使用fr替换时报错,提示读取文件失败。后又替换成sed实现,sed虽然不报错,但是耗时太长,
最后换成gawk实现,耗时还算正常。但是替换总是不成功,也不报错。语句如下,请大神帮忙看看

gawk "{sub(/\\/,/\\\\/,$0);print $0}"  "F:\load_data.txt">123.txt
发表于 2018-9-27 09:35:47 | 显示全部楼层
测试一下小文件,比如只有3行的,能成功吗?先排查一下语法错误
 楼主| 发表于 2018-9-27 14:31:55 | 显示全部楼层
回复 2# Batcher


    比如文本文件内容为:
    aaa\|bbb|ccc|ddd
    eee|fff|gg\\g|hhh
    iii|j\\jj|kkk|lll

    替换后就变成了
    aaa0|bbb|ccc|ddd
    eee|fff|gg1\g|hhh
    iii|j1\jj|kkk|lll

    应该是命令写的有问题!!!
发表于 2018-9-28 09:21:02 | 显示全部楼层
回复 3# shootman2
gawk的全部替换 应该用gsub,第二个参数应该是要替换的字符串不要加//

我是在bash下的,在cmd下引号自行处理。
  1. gawk  '{gsub(/\\/,"\\\",$0);print $0}' file
复制代码
另外用sed应该也差不多的吧,会有很大差别吗?大文件没试过。
  1. sed 's/\\/\\\\/g' file
复制代码
发表于 2018-9-28 09:39:28 | 显示全部楼层
  1. sed "s/\\/\\\\/g" 1.txt > 2.txt
复制代码
楼主能否分享一下sed处理3GB文件大约需要多长时间?
发表于 2018-9-28 09:48:10 | 显示全部楼层
  1. gawk "gsub(/\\/,"\x5c\x5c",$0)" 1.txt > 2.txt
复制代码
对比一下gawk需要多长时间?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:24 , Processed in 0.017539 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表