Вставить разрыв в нужных местах таблицы

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Вставить разрыв в нужных местах таблицы

Сообщение nerve » 25.06.2014 15:40

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

| 11 | dfgd | ytyhtyh | AAA |
| 111 | gfhjd | 345dfg | AAA |
| 12 | 456 | 4356dfg | AAA |
| 22 | 345 | 78jghjgr | BBB |
| 221 | 345 | 78jghjgr | BBB |
| 33 | sdf | 3563 | CCC |
| 33 | sdf | 3563 | CCC |

нужно вставить разрыв или что угодно между ААА и ВВВ, между ВВВ и ССС и так далее.
можно ли сделать так, чтоб не хардкодить ААА, ВВВ и другие ключевые слова?
ожидаемый вывод

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

| 11 | dfgd | ytyhtyh | AAA |
| 111 | gfhjd | 345dfg | AAA |
| 12 | 456 | 4356dfg | AAA |

| 22 | 345 | 78jghjgr | BBB |
| 221 | 345 | 78jghjgr | BBB |

| 33 | sdf | 3563 | CCC |
| 33 | sdf | 3563 | CCC |
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Вставить разрыв в нужных местах таблицы

Сообщение Hephaestus » 25.06.2014 16:15

nerve писал(а):
25.06.2014 15:40
можно ли сделать так, чтоб не хардкодить ААА, ВВВ и другие ключевые слова?
Вряд ли. Так или иначе, какой-то разделитель нужен.
Раньше, когда изучали программирование, говорили о роботах-исполнителях. Для которых нужно было написать алгоритм - четкий и однозначный порядок действий.
Вот компьютер и является таким роботом-исполнителем, который выполняет Ваши команды. Он послушный, но одновременно тупой - делает только то, что сказано, но беспрекословно.
А теперь поставьте себя на его место. Вы способны выделить места, где нужен разделитель, не пользуясь ключевыми словами?
Если да, то хорошо бы знать, как. Эти места обусловлены какой-либо закономерностью? Какой именно?
Ответив на эти вопросы, Вы поймёте, чего не хватает, чтобы объяснить исполнителю Вашу задачу.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Вставить разрыв в нужных местах таблицы

Сообщение Bizdelnick » 25.06.2014 16:23

Hephaestus писал(а):
25.06.2014 16:15
Эти места обусловлены какой-либо закономерностью? Какой именно?

Насколько я понял, эти места обусловлены тем, что содержимое последнего столбца следующей строки отлично от содержимого последнего столбца предыдущей строки. Скрипт, который бы это делал, написать не проблема, но одностроком обойтись вряд ли удастся.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Вставить разрыв в нужных местах таблицы

Сообщение nerve » 25.06.2014 16:32

Bizdelnick писал(а):
25.06.2014 16:23
содержимое последнего столбца следующей строки отлично от содержимого последнего столбца предыдущей строки.

именно это я и имел ввиду, видимо не точно выразился. если в таблице всего два таких различия - можно и захардкодить, но допустим их много - тогда нужен универсальный способ.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Вставить разрыв в нужных местах таблицы

Сообщение Hephaestus » 25.06.2014 16:36

Bizdelnick писал(а):
25.06.2014 16:23
Насколько я понял, эти места обусловлены тем, что содержимое последнего столбца следующей строки отлично от содержимого последнего столбца предыдущей строки.
Не получается.
Речь идет о том, чтобы разделять строки на категории, не пользуясь AAA,BBB,CCC или (что то же самое) проставлять их автоматически.
А теперь посмотрите на первые три строки. В них все столбцы имеют разные значения. Как определить, что там во всех трёх нужно проставить ААА? На мой взгляд никак.
Если же это не реальные данные, а только абстрактный пример, то вопрос остаётся: Какой закономерности подчиняются реальные данные?

Hephaestus писал(а):
25.06.2014 16:36
именно это я и имел ввиду, видимо не точно выразился. если в таблице всего два таких различия - можно и захардкодить, но допустим их много - тогда нужен универсальный способ.
Вам стоило бы показать более внятный пример данных. В приведенном Вами примере эта закономерность не видна.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Вставить разрыв в нужных местах таблицы

Сообщение Bizdelnick » 25.06.2014 16:42

Hephaestus писал(а):
25.06.2014 16:36
Как определить, что там во всех трёх нужно проставить ААА?

Что значит - проставить? Они там уже стоят.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Вставить разрыв в нужных местах таблицы

Сообщение Hephaestus » 25.06.2014 16:43

Bizdelnick писал(а):
25.06.2014 16:42
Что значит - проставить? Они там уже стоят.
Они стоят вручную. А человек хочет ставить их автоматом или вообще обойтись без них.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Вставить разрыв в нужных местах таблицы

Сообщение Bizdelnick » 25.06.2014 16:46

Hephaestus писал(а):
25.06.2014 16:43
человек хочет ставить их автоматом

Он не этого хочет. Он хочет вставлять пустые строки. Он же привёл примеры текста на входе и на выходе.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Вставить разрыв в нужных местах таблицы

Сообщение nerve » 25.06.2014 16:49

хорошо, пусть будет один столбец, закономерность такая: появившись в колонке один раз, такая строка (последовательность символов) больше не появляется, то есть появившись однажды, она может повторятся, но как только появляется другая строка - первая больше не встерчается.

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

AAA
AAA
BBB
BBB
BBB
CCC
CCC
DDD
EEE
FFF
111
DVB

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

AAA
AAA

BBB
BBB
BBB

CCC
CCC

DDD

EEE

FFF

111

DVB
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2580
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Вставить разрыв в нужных местах таблицы

Сообщение Hephaestus » 25.06.2014 16:55

nerve писал(а):
25.06.2014 16:49
Он не этого хочет. Он хочет вставлять пустые строки.

Тогда я не понимаю,что означает вот это
nerve писал(а):
25.06.2014 15:40
не хардкодить ААА, ВВВ и другие ключевые слова?


Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Вставить разрыв в нужных местах таблицы

Сообщение SLEDopit » 25.06.2014 17:01

Вот развели холивар. Вполне понятное описание же.
Bizdelnick писал(а):
25.06.2014 16:23
но одностроком обойтись вряд ли удастся.
фигня вопрос.

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

awk -F '|' '{if(previous!=$(NF-1)&&NR>1)print "";previous=$(NF-1);print $0;}' file
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Вставить разрыв в нужных местах таблицы

Сообщение nerve » 25.06.2014 17:49

Круто!

Shell

$ echo -e "aaa\naaa\nbbb\nccc" | awk -F '|' '{if(previous!=$(NF-1)&&NR>1)print "";previous=$(NF-1);print $0;}' aaa aaa bbb ccc

Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Вставить разрыв в нужных местах таблицы

Сообщение SLEDopit » 25.06.2014 18:08

Ну вообще эта штука была написана для изначального варианта с "|" в качестве разделителя. С "aaa\naaa\nbbb\nccc" оно отработало по случайному совпадению.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Вставить разрыв в нужных местах таблицы

Сообщение nerve » 25.06.2014 18:38

а можно задать номер колонки, например $5, в которой производить сравнение?
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Вставить разрыв в нужных местах таблицы

Сообщение SLEDopit » 25.06.2014 22:56

nerve писал(а):
25.06.2014 18:38
а можно задать номер колонки, например $5, в которой производить сравнение?
Конечно. Вместо $(NF-1) можно и просто номер задать и какой-нибудь хитрый алгоритм зафигачить.
Мне просто показалось, что важно сравнивать именно последнюю колонку.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали: