如何删除不必要的新行?

时间:2017-11-08 22:42:10

标签: bash perl awk sed

我在AIX上有一个文件。 我想删除不必要的新行,但同时在第八个字符^

之后给出一个新行
cat file

    TEST1^2017-11-16^D^N^23:50^123^^^
    TEST1^2017-11-17^D^N^23:50^^123^ALL^
    TEST1^2017-11-18^D^N^23:50^^^12345
    ,123456
    ,12
    ,1234
    ,12345678
    ,1
    ,123
    ,12345
    ,12345
    ,12345
    ,123
    ,1234567890
    ,1234
    ,1234
    ,1234567
    ,1234567^
    TEST2^2017-11-16^D^N^23:50^^^^
    TEST2^2017-11-17^D^N^23:50^^^^
    TEST2^2017-11-18^D^N^23:50^^^^
    TEST3^2017-11-23^D^N^23:50^^^^

我需要这个:

TEST1^2017-11-16^D^N^23:50^123^^^
TEST1^2017-11-17^D^N^23:50^^123^ALL^
TEST1^2017-11-18^D^N^23:50^^^12345,123456,12,1234,12345678,1,123,12345,12345,12345,123,1234567890,1234,1234,1234567,1234567^
TEST2^2017-11-16^D^N^23:50^^^^
TEST2^2017-11-17^D^N^23:50^^^^
TEST2^2017-11-18^D^N^23:50^^^^
TEST3^2017-11-23^D^N^23:50^^^^

请帮助

3 个答案:

答案 0 :(得分:0)

我没有考虑样本输入中可能存在错误的前导空格。如果有8 ^,则每条记录应该有9个字段。

awk -F'^' '{
    # keep concatenating lines while there are fewer than 9 fields
    while (NF < 9) {getline next_line; $0 = $0 next_line}
    print
}' file
    TEST1^2017-11-16^D^N^23:50^123^^^
    TEST1^2017-11-17^D^N^23:50^^123^ALL^
    TEST1^2017-11-18^D^N^23:50^^^12345    ,123456    ,12    ,1234    ,12345678    ,1    ,123    ,12345    ,12345    ,12345    ,123    ,1234567890    ,1234    ,1234    ,1234567    ,1234567^
    TEST2^2017-11-16^D^N^23:50^^^^
    TEST2^2017-11-17^D^N^23:50^^^^
    TEST2^2017-11-18^D^N^23:50^^^^
    TEST3^2017-11-23^D^N^23:50^^^^

答案 1 :(得分:0)

awk救援!

我认为你只需要这个

$ awk -v RS= '{print gensub("([^^])\n","\1","g")}' file

TEST1^2017-11-16^D^N^23:50^123^^^
TEST1^2017-11-17^D^N^23:50^^123^ALL^
TEST1^2017-11-18^D^N^23:50^^^1234,12345,1,123,1234567,,12,1234,1234,1234,12,123456789,123,123,123456,1234567^
TEST2^2017-11-16^D^N^23:50^^^^
TEST2^2017-11-17^D^N^23:50^^^^
TEST2^2017-11-18^D^N^23:50^^^^
TEST3^2017-11-23^D^N^23:50^^^^

如果我的假设不正确并且换行可能发生在任何地方,这可能是最简单的解决方案

$ <file tr -d '\n' | sed -E 's/([^^]*\^){8}/&\n/g'

答案 2 :(得分:-3)

这是一个怪诞的答案,但它是一个答案:

perl -pi -e 's/\n//g' input_file

将摆脱所有换行

perl -pi -e 's/((.*?\^){8})/$1\n/g' input_file

每隔8天添加一行换行符。

我怀疑awk解决方案是方式更清洁,甚至我的perl解决方案都很荒谬,但这是件事。