我正在使用 cygwin 连接到 RAM 有限(512M)的小型虚拟机。
另外,我正在尝试从 4GB csv 文件导入到 sqlite3 数据库,但除了 2 行(总共 8.717.201 行)之外,我没有任何导入线索
似乎我在 2 行上有一个 control-m 字符(^M),因此它破坏了 csv 格式并且无法导入。
当我尝试使用sed 's|,^M|,|' file.csv
control-m char 时,会写入文本 ASCII(2 个字符),因此它不会搜索替换。
当我使用测试文件来执行此操作时,打开它vi
进行搜索和替换,我可以看到它是作为代码编写的(蓝色 ^M 并充当单个字符)
如何修复 csv 文件? (或者我如何在 cygwin 上再次编写 control-m 序列?
有问题的行示例:
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3^M$
,keyword4$
keyword5,keyword1,keyword2$
应该如何:
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3,keyword4$
keyword5,keyword1,keyword2$
PS:如你所见,英语不是我的母语,所以..抱歉有任何错误 ́_(ツ)_/̱
答案1
实际上,回车符可以帮助您识别错误的换行符:
s '/^M$/{N;s/^M\n//;}' test
正如 Steeldriver 所写,您通常可以^M
在ctrlV后面加上ctrlM.
该命令的意思是
/^M$/{...}
:在行尾有分页符的行上执行大括号中的命令N
ext 将下一行追加到缓冲区,并在行之间嵌入换行符s/^M\n//
s
将回车符+换行符替换为空(删除换行符)
这个简单的脚本假设一行最多被破坏一次。否则你需要类似的东西
sed 'H;1h;$!d;x;s/^M\n//g' file
答案2
在 sed 或 vi 上获取代表新行(或 Enter)以进行替换的方法之一^M
是键入:
ctrlV enter