AIX(没有GNU sed / awk)连接行,如果它在末尾没有控制M或\ r \ n字符

时间:2017-03-01 21:19:05

标签: awk sed aix

如果文件不控制M字符,我正在寻找加入行的方法。 AIX有标准的awk和sed实用程序,但没有GNU

问题:我们从第三方获取文件,来自Windows。并且该文件在每行的末尾具有^ M(即\ r)字符,期望某些行,其中某些字段中的数据本身具有\ n字符。因此需要加入具有这个额外\ n字符的行。

数据示例:

col1|col2|col3|col4|col5|^M
a1|a2|a3|a4|a5|^M
b1|b2|b3|b
4|b5|^M
c1|c2|c3|c4|c5|^M

预期产量。

col1|col2|col3|col4|col5|^M
a1|a2|a3|a4|a5|^M
b1|b2|b3|b4|b5|^M
c1|c2|c3|c4|c5|^M

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

仅仅为了记录,perl正在处理\ n,\ r \ n等非常好的转换,没有非gnu sed的限制 - 实际上perl -pe可以直接替换sed。

所以这个操作在BSD中运行良好:

$ echo -ne "abc\r\ndef\nijk\r\nlmn\r\n" |cat -vte
abc^M$
def$
ijk^M$
lmn^M$

$ echo -ne "abc\r\ndef\nijk\r\nlmn\r\n" |perl -pe "s/\r\n/\0/g;s/\n//g;s/\0/\r\n/g" |cat -vte
abc^M$
defijk^M$
lmn^M$

答案 1 :(得分:0)

可以通过键入^V(Ctrl-V)然后键入" Return"来使用文字回车。键。

以下sed(1)脚本循环遍历不在回车符中的行,删除不需要的换行符:

sed '
:label
/^M$/! {
    N
    s/\n//
    blabel
}'

作为一行:

sed -e ':l' -e '/^M$/!{N;s/\n//;bl' -e '}'