我在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^^^^
请帮助
答案 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解决方案都很荒谬,但这是件事。