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