Страница 1 из 1

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

Добавлено: 2012-01-05 9:48:33
capsmolet
Здраствуйте!
Подскажите пожалуйста как в awk можно соединить строки через одну.
Есть:

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

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

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

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

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

Добавлено: 2012-01-06 9:10:51
FiL
етсь NR, есть строка, можно прибавлять к переменной. В конце вывести обе. Вроде можно сделать. И за один проход.

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

Добавлено: 2012-01-06 12:03:49
capsmolet
А можно, если не сложно код, т.к. пока только начал изучать awk, поэтому полный профан, не обессудьте. :cz2: :st:

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

Добавлено: 2012-01-06 23:41:22
FiL
awk 'BEGIN {e="";o=""}; NR%2?o=o $0:e=e $0; END {print o "\n" e}'

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

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

Добавлено: 2012-01-07 23:00:13
kpp
Если немного подпилить, и приукрасить для удобочитаемости, получаем:

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

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}' имя_входного_файла

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

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

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

Добавлено: 2012-01-08 9:43:14
capsmolet
Спасибо большое! :Yahoo!:

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

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