Awk 如何重新连接文本字段中具有控件^M的文件中的行

Awk 如何重新连接文本字段中具有控件^M的文件中的行,awk,sed,Awk,Sed,我正在将100个UDB表中的数据导出到.csv文件中。但是,我在使用导出的数据时遇到了一个问题,因为有些表包含带有控制字符的用户文本,这些字符正在将行拆分为新行。是否有办法使用sed或awk删除^M并仅重新连接受^M影响的行。我可以在输出上清理这个,但是我有太多的表,所以我希望避免在那里检查,因为大多数记录都是好的 需要变为单线的虚线示例 那里应该有两行,但由于^M个字符,它被分成了4行。使用GNU时: sed '/\r$/{s///;N;s/\n//}' file 如果您想“就地”编辑您的文

我正在将100个UDB表中的数据导出到.csv文件中。但是,我在使用导出的数据时遇到了一个问题,因为有些表包含带有控制字符的用户文本,这些字符正在将行拆分为新行。是否有办法使用sed或awk删除^M并仅重新连接受^M影响的行。我可以在输出上清理这个,但是我有太多的表,所以我希望避免在那里检查,因为大多数记录都是好的

需要变为单线的虚线示例 那里应该有两行,但由于^M个字符,它被分成了4行。

使用GNU时:

sed '/\r$/{s///;N;s/\n//}' file

如果您想“就地”编辑您的文件,请使用sed的选项
-i

对您的问题最准确的回答很可能是“不,您不能以您想要的方式可靠地执行此操作”

这是因为您希望将数据解释为实际的CSV,而不仅仅是重新连接行。给定数据格式,
^M
字符是完全有效的字符

foo,"bar","two
words",baz
无论第一行末尾是
^M
还是
^J
,关键是这两行代表一条记录,其中第三个字段包含换行符

另请考虑以下记录:

foo,bar,"one,two",baz
共有四个字段,第三个字段包含逗号。这在逗号引号分隔的文件中完全有效。awk(包括gawk)不理解此数据格式

如果你真的想加入这些行列,你可以采用以下几种策略之一。我最喜欢的一个方法是查看字段计数

$ printf $'foo,bar,"one\r\ntwo",baz\n' | hexdump -c
0000000   f   o   o   ,   b   a   r   ,   "   o   n   e  \r  \n   t   w
0000010   o   "   ,   b   a   z  \n
0000017
$ printf $'foo,bar,"one\r\ntwo",baz\n' | awk -F, 'NF<4 { a=$0; getline b; $0=a b } {sub(/[^[:print:]]+/," ")} 1'
foo,bar,"one two",baz
$printf$'foo,bar,“一个\r\ntwo”,baz\n'| hextump-c
0000000 f o o,b a r,“o n e\r\n t w
00000 10英寸b a z\n
0000017

$printf$'foo,bar,“one\r\ntwo”,baz\n'| awk-F,'nf字段是否以CRLF结尾,因此数据同时包含CR和LF?是否要卸下CR、LF或两者?数据中是否存在重要的(需保留的)CR?(很明显,将有许多重要的LF(换行符、NL、
'\n'
)字符必须保留,也可能有一些字符必须删除,具体取决于此评论中第一个问题的答案。)您的第二行输入以一个
-我们该怎么办?。另外,您是否曾经有过
^M
(和换行符)后跟更多的运行文本,或者它总是且仅位于引号内字段的末尾?哎呀,您忘记发布代码了!StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。即使您不知道如何编写程序,元代码也会演示您认为程序应该如何工作。如果没有您的代码以及对其工作原理的解释,我们只能猜测我们对您的问题描述的解释是否准确。如果您使用非GNU sed,则将
sed$'/\r$/{;s///;N;s/\\N/;}'
作为bash解决方法。我同意您上面的评论,您不能可靠地做到这一点。我越是开始使用包含文本字段的各种表,就越意识到我别无选择,只能通过使用UDB replace函数删除回车符/换行符,直接在数据库中解决这个问题。谢谢你的建议。
$ printf $'foo,bar,"one\r\ntwo",baz\n' | hexdump -c
0000000   f   o   o   ,   b   a   r   ,   "   o   n   e  \r  \n   t   w
0000010   o   "   ,   b   a   z  \n
0000017
$ printf $'foo,bar,"one\r\ntwo",baz\n' | awk -F, 'NF<4 { a=$0; getline b; $0=a b } {sub(/[^[:print:]]+/," ")} 1'
foo,bar,"one two",baz