如何使用 sed 和 awk 处理 csv 文件中的 ^M?

如何使用 sed 和 awk 处理 csv 文件中的 ^M?

我有一个带有分隔符 ~ 的文件,但无法加载到数据库中:

输入文件:

24~1~2~2~unsubscribed~wap~7~2015-10-23 20:03:00~2015-10-24 20:04:00~2015-10-25 02:53:26~Testing duplicate msisdn campaing row rount 29 ^M\
total - 58~58

预期输出:

24~1~2~2~unsubscribed~wap~7~2015-10-23 20:03:00~2015-10-24 20:04:00~2015-10-25 02:53:26~Testing duplicate msisdn campaing row rount 29 total - 58~58

如果您注意到输入文件中有( ^M\)。我想用空格替换这个值。我尝试使用 sed (sed 's/^M\//g' 文件名)。我没有得到预期的结果。搜索^Minvi也给了我“找不到模式”。

答案1

首先,这^M是一个回车( \r),不是换行符 ( \n)。又是\另一回事,它是为了转义换行符,因此 csv 解析程序不会将其视为记录的结尾。

您实际上拥有的是一个在 Windows 上创建的文件,其中行尾由 定义,\r\n而不是像\n在 *nix 上那样。我无法确定,除非您给我们实际文件的摘录,但如果您看到^M\in vim,后跟一个\,然后是换行符,则您可能\r\\n在文件中找到了。所以,试试这个:

perl -i -pe 's/\r\\\n/ /'g file

答案2

新行之前有一个回车符。
您可以s,.$,,删除vim任意行的最后一个字符。
或者你也可以s,^M$,,。要获取真正的“^M”字符而不是序列的正则表达式^,M,$,请按CtrlV然后按CtrlM

答案3

 sed 's/\^M\\//g' filename

转义元字符。

相关内容