сортировка по "подполям" во втором поле ))

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

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

Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

сортировка по "подполям" во втором поле ))

Сообщение McSim » 25.09.2014 15:14

Доброго времени, камрады.
Мучаю свою голову... Имеется текстовый файл типа:

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

p01-fw-5545-e01-e02-2mlbv-sc-primary    1.16.62.229
p01-fw-5545-e01-e02-2mlbv-sc-secondary  1.16.62.230
p01-fw-5545-e01-e02-2srv4-sc-primary    1.16.56.133
p01-fw-5545-e01-e02-2srv4-sc-secondary  1.16.56.134
p01-fw-5545-e01-e02-3srv4-sc-primary    1.16.56.165
p01-fw-5545-e01-e02-3srv4-sc-secondary  1.16.56.166

Мне необходимо отсортировать по порядку по столбцу с IP адресами.
В голову сразу приходит sort -t -k , но он способен использовать только 1 разделитель для строки. А тут получается разделение строки на 2 поля - пробелом, при этом, второе поле делится еще на 4 подполя - точкой (другим разделителем).
:wallbash:

может есть у кого идеи?
Спасибо.
Спасибо сказали:

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

Re: сортировка по "подполям" во втором поле ))

Сообщение nerve » 25.09.2014 15:30

Shell

$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n ip.txt p01-fw-5545-e01-e02-2srv4-sc-primary 1.16.56.133 p01-fw-5545-e01-e02-2srv4-sc-secondary 1.16.56.134 p01-fw-5545-e01-e02-3srv4-sc-primary 1.16.56.165 p01-fw-5545-e01-e02-3srv4-sc-secondary 1.16.56.166 p01-fw-5545-e01-e02-2mlbv-sc-primary 1.16.62.229 p01-fw-5545-e01-e02-2mlbv-sc-secondary 1.16.62.230


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

Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: сортировка по "подполям" во втором поле ))

Сообщение McSim » 25.09.2014 15:50

Да, сортирует корректно )))
спасибо
Я почему то не попробовав, был уверен, что команда будет некорректно сортировать, т.к. в первом поле имеются цифры "p01-fw-5545-e01-e02-2srv4-sc-primary".
Спасибо сказали:

Аватара пользователя
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian

Re: сортировка по "подполям" во втором поле ))

Сообщение McSim » 25.09.2014 16:02

McSim писал(а):
25.09.2014 15:50
Да, сортирует корректно )))
спасибо
Я почему то не попробовав, был уверен, что команда будет некорректно сортировать, т.к. в первом поле имеются цифры "p01-fw-5545-e01-e02-2srv4-sc-primary".

Так и есть...
Усложняем сценарий. Файл вида

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

p01-fw-5545-e01-e02-ntp4-sc-primary     11.16.62.229
m42-fw-5545-e01-e02-2mlbv-sc-secondary  11.0.62.230
p01-fw-5545-e01-e02-2srv4-sc-primary    11.16.56.133
p01-fw-5545-e01-e02-2srv4-sc-secondary  11.16.56.134
p01-fw-5545-e01-e02-3srv4-sc-primary    11.16.56.165
p01-fw-5545-e01-e02-3srv4-sc-secondary  11.16.56.166
P21Core1    A    10.0.21.12
C116Core1    A    10.0.116.11

итого

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

host:~ # sort -t . -k1,1n -k 2,2n -k 3,3n -k 4,4n /tmp/new\ \ 3.txt
P21Core1        A       10.0.21.12
m42-fw-5545-e01-e02-2mlbv-sc-secondary  11.0.62.230
C116Core1       A       10.0.116.11
p01-fw-5545-e01-e02-2srv4-sc-primary    11.16.56.133
p01-fw-5545-e01-e02-2srv4-sc-secondary  11.16.56.134
p01-fw-5545-e01-e02-3srv4-sc-primary    11.16.56.165
p01-fw-5545-e01-e02-3srv4-sc-secondary  11.16.56.166
p01-fw-5545-e01-e02-ntp4-sc-primary     11.16.62.229


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

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: сортировка по "подполям" во втором поле ))

Сообщение drBatty » 26.09.2014 00:12

McSim писал(а):
25.09.2014 15:14
может есть у кого идеи?

$

$ echo " p01-fw-5545-e01-e02-2mlbv-sc-primary 1.16.62.229 p01-fw-5545-e01-e02-2mlbv-sc-secondary 1.16.62.230 p01-fw-5545-e01-e02-2srv4-sc-primary 1.16.56.133 p01-fw-5545-e01-e02-2srv4-sc-secondary 1.16.56.134 p01-fw-5545-e01-e02-3srv4-sc-primary 1.16.56.165 p01-fw-5545-e01-e02-3srv4-sc-secondary 1.16.56.166 " | sed -r 's/(\S+)(\s+)(\S+)/\3\2\1/' 1.16.62.229 p01-fw-5545-e01-e02-2mlbv-sc-primary 1.16.62.230 p01-fw-5545-e01-e02-2mlbv-sc-secondary 1.16.56.133 p01-fw-5545-e01-e02-2srv4-sc-primary 1.16.56.134 p01-fw-5545-e01-e02-2srv4-sc-secondary 1.16.56.165 p01-fw-5545-e01-e02-3srv4-sc-primary 1.16.56.166 p01-fw-5545-e01-e02-3srv4-sc-secondary


идея ясна?

McSim писал(а):
25.09.2014 16:02
Усложняем сценарий.

man sort (опция --numeric-sort)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3

Re: сортировка по "подполям" во втором поле ))

Сообщение lazhu » 26.09.2014 12:11

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

 awk '{print $2, $1}' ip.txt | sort | awk '{print $2, $1}' | column -tx

Усложняем сценарий. Файл вида


Общий вариант:

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

awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' test | sort | awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' | column -tx
Спасибо сказали:

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

Re: сортировка по "подполям" во втором поле ))

Сообщение nerve » 26.09.2014 13:22

в первом случае трубу с column -tx можно заменить на

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

awk '{print $2, $1}' ip.txt | sort | awk 'BEGIN {OFS="\t"}{print $2, $1}'


во втором сортирует как-то не так, разве 21 должно идти после 116?

Shell

$ awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' ip.txt \ | sort | awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' | column -tx C116Core1 A 10.0.116.11 P21Core1 A 10.0.21.12 m42-fw-5545-e01-e02-2mlbv-sc-secondary 11.0.62.230 p01-fw-5545-e01-e02-2srv4-sc-primary 11.16.56.133 p01-fw-5545-e01-e02-2srv4-sc-secondary 11.16.56.134 p01-fw-5545-e01-e02-3srv4-sc-primary 11.16.56.165 p01-fw-5545-e01-e02-3srv4-sc-secondary 11.16.56.166 p01-fw-5545-e01-e02-ntp4-sc-primary 11.16.62.229

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

lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3

Re: сортировка по "подполям" во втором поле ))

Сообщение lazhu » 26.09.2014 15:10

nerve писал(а):
26.09.2014 13:22
в первом случае трубу с column -tx можно заменить на

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

awk '{print $2, $1}' ip.txt | sort | awk 'BEGIN {OFS="\t"}{print $2, $1}'
А если одного таба недостаточно?
nerve писал(а):
26.09.2014 13:22
во втором сортирует как-то не так, разве 21 должно идти после 116?
Должно, для этого надо сортировать по каждому октету:

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

sort -t . -k1,1n -k2,2n -k3,3n -k4,4n
Спасибо сказали:

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

Re: сортировка по "подполям" во втором поле ))

Сообщение nerve » 26.09.2014 16:53

точно

Shell

$ awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' ip.txt \ | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n \ | awk '{for (i = NF; i >= 1; i--) printf "%s ", $i; printf "\n"}' | column -tx P21Core1 A 10.0.21.12 C116Core1 A 10.0.116.11 m42-fw-5545-e01-e02-2mlbv-sc-secondary 11.0.62.230 p01-fw-5545-e01-e02-2srv4-sc-primary 11.16.56.133 p01-fw-5545-e01-e02-2srv4-sc-secondary 11.16.56.134 p01-fw-5545-e01-e02-3srv4-sc-primary 11.16.56.165 p01-fw-5545-e01-e02-3srv4-sc-secondary 11.16.56.166 p01-fw-5545-e01-e02-ntp4-sc-primary 11.16.62.229

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