Board logo

标题: gawk替换\字符问题 [打印本页]

作者: shootman2    时间: 2018-9-27 00:57     标题: gawk替换\字符问题

本帖最后由 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
作者: Batcher    时间: 2018-9-27 09:35

测试一下小文件,比如只有3行的,能成功吗?先排查一下语法错误
作者: shootman2    时间: 2018-9-27 14:31

回复 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

    应该是命令写的有问题!!!
作者: cfwyy77_bat    时间: 2018-9-28 09:21

回复 3# shootman2
gawk的全部替换 应该用gsub,第二个参数应该是要替换的字符串不要加//

我是在bash下的,在cmd下引号自行处理。
  1. gawk  '{gsub(/\\/,"\\\\",$0);print $0}' file
复制代码
另外用sed应该也差不多的吧,会有很大差别吗?大文件没试过。
  1. sed 's/\\/\\\\/g' file
复制代码

作者: Batcher    时间: 2018-9-28 09:39

  1. sed "s/\\/\\\\/g" 1.txt > 2.txt
复制代码
楼主能否分享一下sed处理3GB文件大约需要多长时间?
作者: Batcher    时间: 2018-9-28 09:48

  1. gawk "gsub(/\\/,\"\x5c\x5c\",$0)" 1.txt > 2.txt
复制代码
对比一下gawk需要多长时间?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2