На самом деле это единственный раздел про 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 подполя - точкой (другим разделителем).
может есть у кого идеи?
Спасибо.
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Контактная информация:
Сообщение
McSim » 25.09.2014 15:50
Да, сортирует корректно )))
спасибо
Я почему то не попробовав, был уверен, что команда будет некорректно сортировать, т.к. в первом поле имеются цифры "p01-fw-5545-e01-e02-2srv4-sc-primary".
McSim
Сообщения: 419
Статус: Экспериментатор
ОС: заGNU/Linux Debian
Контактная информация:
Сообщение
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
Контактная информация:
Сообщение
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)
lazhu
Сообщения: 70
ОС: FreeBSD 9-STABLE / clang 3.3
Контактная информация:
Сообщение
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
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Контактная информация:
Сообщение
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?
Должно, для этого надо сортировать по каждому октету:
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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