Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: BASH, SED, AWK стоки, столбцы  (Прочитано 5074 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
BASH, SED, AWK стоки, столбцы
« : 13 Октября 2013, 23:07:01 »
Здравствуйте.
У меня в скрипте-однострочнике на одном этапе получаются данные такого вида (передаются через |)
   бла-бла-бла, 13 октября

                 бла-бла
   xygkghjgfkgk
                 бла-бла-бла
   kjhhhkfhdjyfdyfi
                бла-бла
   ukhjgjkhjkgkgjgjggkgyighkg
                 абракадабра
   kjgjgkjgjgjgjgk

  бла-бла-бла-бла, пн, 14 октября

               hkgkjg
   kgkjgkjkghgk
               jgkjg
   jgkjgjkgjkbg
              gjkgkgj
   kgjghkjhihljk
               jgkjgjgkj
   khjjkbjbmnjhkghcfhghgchtg
Где вместо букв некие данные, не имеющие никакого понятного для машины смысла. Единственная жесткая вещь - это номера строк. Их ровно столько, сколько я привёл. Мне надо вывести всё это дело в таком виде (для удобства пишу номера строк):
01)бла-бла-бла, 13 октября      12)бла-бла-бла-бла, пн, 14 октября
02)                             13)
03)бла-бла                      14)hkgkjg
04)xygkghjgfkgk                 15)kgkjgkjkghgk
05)бла-бла-бла                  16)jgkjg
06)kjhhhkfhdjyfdyfi             17)jgkjgjkgjkbg
07)бла-бла                      18)gjkgkgj
08)ukhjgjkhjkgkgjgjggkgyighkg   19)kgjghkjhihljk
09)абракадабра                  20)jgkjgjgkj
10)kjgjgkjgjgjgjgk              21)khjjkbjbmnjhkghcfhghgchtg
11 строка - разделитель, сколько символов в строке - неизвестно, шрифт, разумеется, моноширный, остаётся вопрос - как?
Что-то? не радует идея - считать сколько символов максимум в строках 1-10, прибавлять к этому числу 3 и добавлять к каждой строке ровно столько пробелов, после чего объединять первую строку с 12, вторую с 13 и т.д. Может что готовое есть, дабы не изобретать очередной велосипед?

Оффлайн Self-Perfection

  • Активист
  • *
  • Сообщений: 331
  • Arch linux, KDE
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #1 : 14 Октября 2013, 00:26:19 »
Вашу фигню в

Код: (bash) [Выделить]
| sed 11d | pr -tJ --columns=2
И будет ЩАСТЕ!  8)

UPD: Я в команде выше исходил из предположения, что разделитель всегда на десятой строке, до и после него всегда 10 строк. Это так?
« Последнее редактирование: 14 Октября 2013, 00:34:10 от Self-Perfection »
Читайте документацию, наставницу вашу!
Памятка по описанию проблем:
Для решения [такой-то задачи] делаю [такие-то действия], но вместо [ожидаемый результат] получаю [описание отличий].

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #2 : 14 Октября 2013, 00:36:21 »
Self-Perfection, да, спасибо, но не совсем так получается, как надо.

Пользователь решил продолжить мысль 14 Октября 2013, 00:40:41:
Self-Perfection, разделитель на 11 строке.

Пользователь решил продолжить мысль 14 Октября 2013, 00:58:11:
Self-Perfection,
Вот так почти то что нужно
 | pr -tJ --columns=2
но остаётся проблема с выравниванием, оно никакое. Строки склеились, а столбцы поплыли.
« Последнее редактирование: 14 Октября 2013, 00:58:11 от peregrine »

Оффлайн Self-Perfection

  • Активист
  • *
  • Сообщений: 331
  • Arch linux, KDE
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #3 : 14 Октября 2013, 01:09:56 »
Покажите пример входных данных, для которых врыравнивание получается кривое.
Читайте документацию, наставницу вашу!
Памятка по описанию проблем:
Для решения [такой-то задачи] делаю [такие-то действия], но вместо [ожидаемый результат] получаю [описание отличий].

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #4 : 14 Октября 2013, 01:21:51 »
Сегодня, 14 октября

утро
Вася Пупкин проснулся
день
Вася Пупкин пошёл в магазин
вечер
Вася Пупкин пил пиво
ночь
Вася Пупкин крепко спал

Завтра, вт, 15 октября

утро
Вася Пупкин проснётся
день
Вася Пупкин пойдёт в магазин
вечер
Вася Пупкин будет пить пиво
ночь
Вася Пупкин будет крепко спать

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #5 : 14 Октября 2013, 01:45:01 »
L~$
L~$ echo -e "\tbla"
bla
L~$ echo -e "\tbla" | sed 's/\t//g'
bla
L~$ echo -e "              bla"
              bla
L~$ echo -e "               bla" | sed 's/\t//g'
               bla
L~$ echo -e "               bla" | sed 's/^[ \t]\+//g'
bla
L~$
Wars ~.o

Оффлайн Self-Perfection

  • Активист
  • *
  • Сообщений: 331
  • Arch linux, KDE
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #6 : 14 Октября 2013, 01:49:42 »
Так у вас кириллица в данных! GNU утилиты плохо с юникодом дружат до сих пор, увы. Длину строк повально определяют в количестве байт, а не символов, а поскольку кирилиические символы в utf-8 занимают по два байта, а пробелы с пунктуацией - по одному, возникает такая лажа при отображении.

Боюсь, для текста с кириллицей придётся костылить самому.
« Последнее редактирование: 14 Октября 2013, 02:00:07 от Self-Perfection »
Читайте документацию, наставницу вашу!
Памятка по описанию проблем:
Для решения [такой-то задачи] делаю [такие-то действия], но вместо [ожидаемый результат] получаю [описание отличий].

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #7 : 14 Октября 2013, 01:55:37 »
Self-Perfection,
Python? мне ненадо.
Wars ~.o

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #8 : 14 Октября 2013, 19:18:59 »
Self-Perfection, по хорошему gnu утилиты с utf8 без проблем должны работать. Придётся свой велосипед писать. >:(

Оффлайн Self-Perfection

  • Активист
  • *
  • Сообщений: 331
  • Arch linux, KDE
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #9 : 14 Октября 2013, 21:21:40 »
Self-Perfection, по хорошему gnu утилиты с utf8 без проблем должны работать. Придётся свой велосипед писать. >:(
Ну есть ещё вариант пропатчить pr. Если примут в апстрим, то все спасибо скажут :)
Читайте документацию, наставницу вашу!
Памятка по описанию проблем:
Для решения [такой-то задачи] делаю [такие-то действия], но вместо [ожидаемый результат] получаю [описание отличий].

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #10 : 18 Октября 2013, 19:02:42 »
Задача эта весьма сложна. Символы бывают разные.

Here is an example
Here is an example, here is an example


Я уж не говорю про лигатуры типа ffi; U+2002 EN SPACE, U+200A HAIR SPACE,
U+200B ZERO WIDTH SPACE и прочую шушеру.

Кстати, column кое с чем справляется:



Другие символы не проверял.

В браузере у меня выглядит криво:
Код: (bash) [Выделить]
sol@eee:~/cols$ column -c 3 -t
John never sleeps
i c u 
Вася пьёт пиво

John  never  sleeps
i         c      u
Вася      пьёт   пиво

Насколько я понимаю, где-то должна быть информация о ширине юникодных
символов в моноширинных шрифтах (нулевая, одинарная, двойная), но я
пока что видел только про byte width :(
Делюсь знаниями, но их у меня мало!

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #11 : 18 Октября 2013, 20:47:57 »
inkblack, тут проблема не в том, что есть спецсимволы не стандартной ширины, а в том, что tr не работает с кириллицей, так как заточен под ASCII и просто не правильно считает количество кириллических символов. У меня обычная кириллица без выкрутас.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #12 : 18 Октября 2013, 21:05:36 »
Если только ASCII и кириллица, то написать несложно.
Но да, будет этакий велосипед, да еще и с ограничениями.
Делюсь знаниями, но их у меня мало!

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: BASH, SED, AWK стоки, столбцы
« Ответ #13 : 19 Октября 2013, 18:58:10 »
peregrine,
Код: (bash) [Выделить]
$ I="1" ; J="0" ; L="30" ; M="11" ; echo '   бла-бла-бла, 13 октября

                 бла-бла
   xygkghjgfkgk
                 бла-бла-бла
   kjhhhkfhdjyfdyfi
                бла-бла
   ukhjgjkhjkgkgjgjggkgyighkg
                 абракадабра
   kjgjgkjgjgjgjgk

  бла-бла-бла-бла, пн, 14 октября

               hkgkjg
   kgkjgkjkghgk
               jgkjg
   jgkjgjkgjkbg
              gjkgkgj
   kgjghkjhihljk
               jgkjgjgkj
   khjjkbjbmnjhkghcfhghgchtg' | sed 's/^[ \t]*//' | while read LINE ; do if [ "$((I%M))" -eq "0" ] ; then let J+=$L ; echo -e "\033[${M}A" ; else echo -e "\033[${J}C$LINE" ; fi ; let I++ ; done
 бла-бла-бла, 13 октября      бла-бла-бла-бла, пн, 14 октября

 бла-бла                      hkgkjg
 xygkghjgfkgk                 kgkjgkjkghgk
 бла-бла-бла                  jgkjg
 kjhhhkfhdjyfdyfi             jgkjgjkgjkbg
 бла-бла                      gjkgkgj
 ukhjgjkhjkgkgjgjggkgyighkg   kgjghkjhihljk
 абракадабра                  jgkjgjgkj
 kjgjgkjgjgjgjgk              khjjkbjbmnjhkghcfhghgchtg
« Последнее редактирование: 19 Октября 2013, 19:05:44 от ArcFi »

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH, SED, AWK стоки, столбцы
« Ответ #14 : 19 Октября 2013, 19:20:37 »
ArcFi, спасибо огромное.

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.