Конкатенация через строку

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
capsmolet
проходил мимо
Сообщения: 8
Зарегистрирован: 2011-12-29 15:16:03

Конкатенация через строку

Непрочитанное сообщение capsmolet » 2012-01-05 9:48:33

Здраствуйте!
Подскажите пожалуйста как в awk можно соединить строки через одну.
Есть:

Код: Выделить всё

Строка 1
Строка 2
Строка 3
Строка 4
Строка 5
Строка 6
Строка ...
Надо

Код: Выделить всё

Строка 1 Строка 3 Строка 5
Строка 2 Строка 4 Строка 6
Т.е., необходимо соединить в одну строку все нечетные строки и также все четные строки до конца файла.
Можно ли это сделать за один проход?
Спасибо.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Конкатенация через строку

Непрочитанное сообщение FiL » 2012-01-06 9:10:51

етсь NR, есть строка, можно прибавлять к переменной. В конце вывести обе. Вроде можно сделать. И за один проход.

capsmolet
проходил мимо
Сообщения: 8
Зарегистрирован: 2011-12-29 15:16:03

Re: Конкатенация через строку

Непрочитанное сообщение capsmolet » 2012-01-06 12:03:49

А можно, если не сложно код, т.к. пока только начал изучать awk, поэтому полный профан, не обессудьте. :cz2: :st:

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Конкатенация через строку

Непрочитанное сообщение FiL » 2012-01-06 23:41:22

awk 'BEGIN {e="";o=""}; NR%2?o=o $0:e=e $0; END {print o "\n" e}'

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Конкатенация через строку

Непрочитанное сообщение kpp » 2012-01-07 23:00:13

Если немного подпилить, и приукрасить для удобочитаемости, получаем:

Код: Выделить всё

awk 'BEGIN {e="";o=""} { if (NR%2){ if (o==""){o=$0}else{o=o" "$0} }else{ if (e==""){e=$0}else{e=e" "$0} } } END {print o "\n" e}' имя_входного_файла
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Конкатенация через строку

Непрочитанное сообщение FiL » 2012-01-08 7:04:43

а зачем так много ифов? Пробелы вставлять? Так проще тогда NR%2?o=o $0" ":e=e $0" "; ну будет в конце лишний пробел... ну можно потом обрезать если оно критично. Но проверок меньше и код понятнее.

capsmolet
проходил мимо
Сообщения: 8
Зарегистрирован: 2011-12-29 15:16:03

Re: Конкатенация через строку

Непрочитанное сообщение capsmolet » 2012-01-08 9:43:14

Спасибо большое! :Yahoo!:

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Конкатенация через строку

Непрочитанное сообщение kpp » 2012-01-08 14:41:32

FiL писал(а):а зачем так много ифов? Пробелы вставлять? Так проще тогда NR%2?o=o $0" ":e=e $0" "; ну будет в конце лишний пробел... ну можно потом обрезать если оно критично. Но проверок меньше и код понятнее.
Да, много ифов для правильной расстановки пробелов без лишнего прохода (ведь просили за один проход?). Хотя, конечно, смотря что понимать под проходом? ;)
Хороший язык программирования отличается наличием множества вариантов решения (и стилей написания) одной задачи.
Выбирайте какой ближе к телу :pardon:
P.S. "Понятнее код" и "минизация кода" - это не тождественные понятия. Я так думаю.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.