2017-02-14 30 views
1

У меня есть файл, который изредка разделяет строки. Разделение сигнализируется тем фактом, что линия начинается с пробела, пустой строки или непигового символа. Например.Присоединение строк в зависимости от начала строки

40403813|7|Failed|No such file or directory|1 
40403816|7|Hi, 
The Conversion System could not be reached.|No such file or directory||1 
40403818|7|Failed|No such file or directory|1 
... 

Я хотел бы присоединиться к раздвоению линии обратно с предыдущей строкой (как указано ниже):

40403813|7|Failed|No such file or directory|1 
40403816|7|Hi, The Conversion System could not be reached.|No such file or directory||1 
40403818|7|Failed|No such file or directory|1 
... 

с помощью команды Unix, как SED/AWK. Я не понимаю, как присоединиться к линии с предыдущей.

Любое предложение?

ответ

3

Ничего не делать на основе значений строк в ваших полей, которые могли бы пойти не так. Например, вы можете получить линию обертывания, которая начинается с цифры.Вместо этого просто печать после каждой полной записи 5 полей:

$ awk -F'|' '{rec=rec $0; nf+=NF} nf>=5{print rec; nf=0; rec=""}' file 
40403813|7|Failed|No such file or directory|1 
40403816|7|Hi, The Conversion System could not be reached.|No such file or directory||1 
40403818|7|Failed|No such file or directory|1 
+0

Когда линия расщепляется в последнем поле, вы по-прежнему рассчитывать 5 полей. –

+0

@WalterA Хорошая точка, но она СМОТРЕТЬ, как OP не имеет этого случая. Сказав это, выборка выборки OPs иногда имеет 5, а иногда и 6 полей, поэтому idk, каково его реальное требование - я перейду, если OP разъяснит и обеспечит лучший ввод/вывод образца. –

3

awk на помощь!

awk -v ORS='' 'NR>1 && /^[0-9]/{print "\n"} NF' file 

только печать новой строки, если текущая строка начинается с цифры, в противном случае добавление строк (возможно, вы можете добавить пробел в ORS если разрыв строки не сохранить пространство).

2

Try:

awk 'NF{printf("%s",$0 ~ /^[0-9]/ && NR>1?RS $0:$0)} END{print ""}' Input_file 
OR 
    awk 'NF{printf("%s",/^[0-9]/ && NR>1?RS $0:$0)} END{print ""}' Input_file 

Он будет проверять, если каждая строка начинается с цифры или нет, если да, и больше, чем номер строки 1, чем он будет вставить новую строку с-то иначе это будет просто распечатать его, также он выведет новую строку после прочтения всего файла, если не упомянуть об этом, он не будет вставлять это в конец файла.

2

Если вы только когда-либо раскол линии на две части, вы можете использовать этот патч в команду:

sed 'N;s/\n\([^[:digit:]]\)/\1/;P;D' infile 

Это добавляет следующую строку в шаблоне пространства, проверяет, является ли перевод строки следует нечто иное, чем и если это так, удаляет прерывание линии, печатает пространство шаблонов вплоть до первой строки, а затем удаляет напечатанную часть.

Если одна линия может быть разбита на более чем две линии, мы должны перебрать подстановки:

sed ':a;N;s/\n\([^[:digit:]]\)/\1/;ta;P;D' infile 

This ветви с ta к :a если замена прошла.

Для использования с Mac OS SED, метка и ветвление команда должна быть отделена от остальной части команды:

sed -e ':a' -e 'N;s/\n\([^[:digit:]]\)/\1/;ta' -e 'P;D' infile 
2

Если продолжение линии всегда начинаются с одного места:

perl -0000 -lape 's/\n//g' input 

Если продолжение линия может начинаться с произвольным количеством пробелов:

perl -0000 -lape 's/\n(\s+)/$1/g' input 

It Вероятно, более идиоматических написать:

perl -0777 -ape 's/\n//g' input 
1

Вы можете использовать sed, когда у вас есть файл без \r:

tr "\n" "\r" < inputfile | sed 's/\r\([^0-9]\)/\1/g' | tr '\r' '\n'