Вопрос:

Как я могу удалить ненужные новые строки?

bash perl awk sed

112 просмотра

3 ответа

21 Репутация автора

У меня есть файл в 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^^^^

пожалуйста помоги

Автор: MartinusP Источник Размещён: 08.11.2017 10:42

Ответы (3)


-3 плюса

2314 Репутация автора

Это гротескный ответ, но это ответ:

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

избавится от всех ваших новых строк

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

Добавлю новую строку для каждого 8-го ^.

Я подозреваю, что awk-решение будет намного чище, и даже мое perl-решение смешно, но это что-то.

Автор: zzxyz Размещён: 08.11.2017 11:09

0 плюса

179707 Репутация автора

Решение

Я не учитываю возможные неправильные начальные пробелы во входных данных примера. Если их 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^^^^
Автор: glenn jackman Размещён: 08.11.2017 11:18

0 плюса

52554 Репутация автора

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'
Автор: karakfa Размещён: 08.11.2017 11:25
Вопросы из категории :
32x32