sed соединяет линии - PullRequest
       29

sed соединяет линии

27 голосов
/ 21 октября 2011

Какой будет команда sed (или другой инструмент) для объединения строк в файле, которые не заканчиваются символом '0'?

У меня будут такие строки

412 | n | Лидер Строительный материал |||||||||| d | d | 20 || 0

, который нужно оставить в покое, и тогда у меня будут такие строки, например, (это 3 строки, но только одна заканчивается w / 0)

107 | n | Инструменты завязывания узлов ||||| Инструменты завязывания узлов

||||| d | d | 0 || 0

которые необходимо объединить / объединить в одну строку

107 | n | Инструменты завязывания узлов ||||| Инструменты завязывания узлов ||||| d | d | 0 || 0

Ответы [ 5 ]

46 голосов
/ 21 октября 2011
 sed ':a;/0$/{N;s/\n//;ba}'

В цикле (ветвь ba до метки :a), если текущая строка заканчивается 0 (/0$/), добавить следующую строку (N) и удалить внутреннюю новую строку (s/\n//).

awk:

awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'

Perl:

perl -pe '$_.=<>,s/\n// while /0$/'

bash:

while read line; do 
    if [ ${line: -1:1} != "0" ] ; then 
        echo $line
    else echo -n $line
fi
done 
9 голосов
/ 22 октября 2011

awk тоже может быть коротким:

awk '!/0$/{printf $0}/0$/'

тест:

kent$  cat t
#aasdfasdf
#asbbb0
#asf
#asdf0
#xxxxxx
#bar

kent$  awk '!/0$/{printf $0}/0$/' t
#aasdfasdf#asbbb0
#asf#asdf0
#xxxxxx#bar 
4 голосов
/ 01 марта 2013

Оценка этого ответа удивительна ;s (этот удивленный подмигивающий смайлик на замену sed является преднамеренным) с учетом спецификаций OP: sed объединяет строки вместе .

Последний комментарий *

"в этом случае проверьте, что отправлено @ninjalj"

также предлагает проверить то же самое ответ .

т.е.Проверьте, используя sed ':a;/0$/{N;s/\n//;ba}' дословно

sed ':a;/0$/{N;s/\n//;ba}'
 does
 no one
 ie. 0
 people,
 try
 nothing,

 ie. 0
 things,
 any more,
 ie. 0
 tests?

          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

, который не даст (выполните тест;):

 does no one ie. 0
 people, try nothing, ie. 0
 things, any more, ie. 0
 tests?          (^D aka eot 004 ctrl-D ␄  ... bash generate via: echo ^V^D)

Чтобы получить это использование:

sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

или:

sed ':a;/0$/!{N;s/\n//;ba}'

не:

sed ':a;/0$/{N;s/\n//;ba}'

Примечания:

sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'

не использует ветвления и
идентичен:

sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
  • H начинает все последовательности
  • d замыкает накоротко дальнейшее выполнение команды сценария в текущей строке и запускает следующий цикл, поэтому селекторы адресов, следующие за /0$/!, могут быть только /0$/!!, поэтому селектор адресов
    /0$/{H;z;x;s/\n//g;} является избыточным и не нужен.
  • , если строка не заканчивается на 0, сохраните ее в поле удержания
    /0$/!{H;d;}
  • если строка заканчивается на 0, сохраните ее, а затем напечатайте флеш (двойной ввод, т. е. очищенный и выравнивание строк)
    /0$/{H;z;x;s/\n//g;}
  • NB ${H;z;x;s/\n//g;p;} использует команды /0$/ ... с дополнительными p для принудительного завершения печати и теперь с ненужным z (для очистки и сброса пространства шаблона, например s /.*//)
2 голосов
/ 21 октября 2011

Обычно загадочный однострочный Perl:

perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'

В качестве разделителя записей используется последовательность "0 \ n" (на ваш вопрос, я предполагаю, что каждая строка должна заканчиваться нулем).Любая запись не должна иметь внутренних новых строк, поэтому они будут удалены, затем напечатайте строку, добавив 0 и новую строку, которые были удалены.

Еще один ответ на ваш вопрос будет состоять в том, чтобы в каждой строке было 17 разделенных трубамиполя.Это не предполагает, что значение 17-го поля должно быть нулевым.

awk -F \| '
    NF == 17 {print; next}
    prev {print prev $0; prev = ""}
    {prev = $0}
'
2 голосов
/ 21 октября 2011

, если заканчивается 0, удалить новую строку ..

sed '/0$/!N;s/\n//'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...