Неверная сортировка текстового файла

У меня есть этот простой текстовый файл и вы хотите сортировать все строки по столбцу response_time:

1 console-2017_09_17.log:2017-09-17 00:04:02,507:INFO :pool-8982-thread-30:r.a.u.j.PerfRequestInterceptor - method=GET, uri==43975&items, response_time=1030, response_code=300 2 console-2017_09_17.log:2017-09-17 00:04:02,628:INFO :pool-8982-thread-77:r.a.u.j.PerfRequestInterceptor - method=GET, uri==PBD4766&items, response_time=1142, response_code=200 3 console-2017_09_17.log:2017-09-17 00:04:02,651:INFO :pool-8982-thread-67:r.a.u.j.PerfRequestInterceptor - method=GET, uri==MDC1810C&items, response_time=1166, response_code=200 4 console-2017_09_17.log:2017-09-17 00:04:02,655:INFO :pool-8984-thread-47:r.a.u.j.PerfRequestInterceptor - method=GET, uri==1031086&items, response_time=1005, response_code=200 5 console-2017_09_17.log:2017-09-17 00:04:02,668:INFO :pool-8984-thread-50:r.a.u.j.PerfRequestInterceptor - method=GET, uri==F1018P&items, response_time=1018, response_code=200 6 console-2017_09_17.log:2017-09-17 00:04:02,677:INFO :pool-8983-thread-86:r.a.u.j.PerfRequestInterceptor - method=GET, uri==V2581261&items, response_time=1060, response_code=200 7 console-2017_09_17.log:2017-09-17 00:04:02,681:INFO :pool-8982-thread-68:r.a.u.j.PerfRequestInterceptor - method=GET, uri==202581&items, response_time=1196, response_code=200 8 console-2017_09_17.log:2017-09-17 00:04:02,686:INFO :pool-8984-thread-46:r.a.u.j.PerfRequestInterceptor - method=GET, uri==1563200600&, response_time=1036, response_code=200 9 console-2017_09_17.log:2017-09-17 00:04:02,693:INFO :pool-8983-thread-29:r.a.u.j.PerfRequestInterceptor - method=GET, uri==8DB355025371, response_time=1207, response_code=200

Я пробовал это следующим образом:

sort -n -t " " -k 8 myfile.txt

Но я все еще получил несортированный файл. Почему?

UPD: время может быть меньше 1000 и более 9999:

1 console-2017_09_17.log:2017-09-17 00:04:02,507:INFO :pool-8982-thread-30:r.a.u.j.PerfRequestInterceptor - method=GET, uri==43975&items, response_time=11030, response_code=300 2 console-2017_09_17.log:2017-09-17 00:04:02,628:INFO :pool-8982-thread-77:r.a.u.j.PerfRequestInterceptor - method=GET, uri==PBD4766&items, response_time=1142, response_code=200 3 console-2017_09_17.log:2017-09-17 00:04:02,651:INFO :pool-8982-thread-67:r.a.u.j.PerfRequestInterceptor - method=GET, uri==MDC1810C&items, response_time=1166, response_code=200 4 console-2017_09_17.log:2017-09-17 00:04:02,655:INFO :pool-8984-thread-47:r.a.u.j.PerfRequestInterceptor - method=GET, uri==1031086&items, response_time=1005, response_code=200 5 console-2017_09_17.log:2017-09-17 00:04:02,668:INFO :pool-8984-thread-50:r.a.u.j.PerfRequestInterceptor - method=GET, uri==F1018P&items, response_time=1018, response_code=200 6 console-2017_09_17.log:2017-09-17 00:04:02,677:INFO :pool-8983-thread-86:r.a.u.j.PerfRequestInterceptor - method=GET, uri==V2581261&items, response_time=1060, response_code=200 7 console-2017_09_17.log:2017-09-17 00:04:02,681:INFO :pool-8982-thread-68:r.a.u.j.PerfRequestInterceptor - method=GET, uri==202581&items, response_time=1196, response_code=200 8 console-2017_09_17.log:2017-09-17 00:04:02,686:INFO :pool-8984-thread-46:r.a.u.j.PerfRequestInterceptor - method=GET, uri==1563200600&, response_time=1036, response_code=200 9 console-2017_09_17.log:2017-09-17 00:04:02,693:INFO :pool-8983-thread-29:r.a.u.j.PerfRequestInterceptor - method=GET, uri==8DB355025371, response_time=7, response_code=200

UPD: Я уменьшаю параметр uri. Он может содержать разные числа «=».

-5
задан 18 September 2017 в 14:49

8 ответов

Как ничто в этом случае просто не отбрасывает -n, а также параметр -t:

sort -k 8 myfile.txt

Если вы, однако, хотите знать, почему ваш путь Не удалось, давайте --debug:

> sort -n -t " " -k 8 --debug myfile.txt sort: using simple byte comparison sort: key 1 is numeric and spans multiple fields 1 console-2017_09_17.log:2017-09-17 00:04:02,507:INFO :pool-8982-thread-30:r.a.u.j.PerfRequestInterceptor - method=GET, uri==43975&items, response_time=1030, response_code=300 ^ no match for key ________________________________________________________________________________________________________________________________________________________________________________ … … …

Он показывает, что с вашим KEYDEF что-то не так:

KEYDEF - F [.C] [OPTS] [, F [. C] [OPTS]] для положения начала и остановки, где F - номер поля и C - позиция символа в поле; оба имеют значение 1, а положение остановки по умолчанию соответствует концу линии. Если ни -t или -b не действуют, символы в поле подсчитываются с начала предыдущего пробела. OPTS - это одна или несколько однобуквенных опций заказа [bdfgiMhnRrV], которые переопределяют глобальные параметры заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа. Используйте -debug для диагностики неправильного использования ключа.

Для вашего случая это будет правильным:

sort -n -t " " -k 8.15,8.19 myfile.txt
0
ответ дан 18 July 2018 в 06:38
sort -k8V ex.txt

где

-k8V означает: ключ является 8-м полем, а критерии порядка - «sort version»

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

0
ответ дан 18 July 2018 в 06:38

sort -t " " -k 8 myfile.txt выводит на терминал желаемый результат. Вам не нужно использовать параметр -n, потому что поле, которое вы хотите отсортировать, не содержит только цифры.

0
ответ дан 18 July 2018 в 06:38

sort принимает в качестве разделителя все, что вы ему даете, поэтому просто дайте ему правильную вещь:

sort -n -t "=" -k5

сортировать численно после четвертого =.

0
ответ дан 18 July 2018 в 06:38

Как ничто в этом случае просто не отбрасывает -n, а также параметр -t:

sort -k 8 myfile.txt

Если вы, однако, хотите знать, почему ваш путь Не удалось, давайте --debug:

> sort -n -t " " -k 8 --debug myfile.txt sort: using simple byte comparison sort: key 1 is numeric and spans multiple fields 1 console-2017_09_17.log:2017-09-17 00:04:02,507:INFO :pool-8982-thread-30:r.a.u.j.PerfRequestInterceptor - method=GET, uri==43975&items, response_time=1030, response_code=300 ^ no match for key ________________________________________________________________________________________________________________________________________________________________________________ … … …

Он показывает, что с вашим KEYDEF что-то не так:

KEYDEF - F [.C] [OPTS] [, F [. C] [OPTS]] для положения начала и остановки, где F - номер поля и C - позиция символа в поле; оба имеют значение 1, а положение остановки по умолчанию соответствует концу линии. Если ни -t или -b не действуют, символы в поле подсчитываются с начала предыдущего пробела. OPTS - это одна или несколько однобуквенных опций заказа [bdfgiMhnRrV], которые переопределяют глобальные параметры заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа. Используйте -debug для диагностики неправильного использования ключа.

Для вашего случая это будет правильным:

sort -n -t " " -k 8.15,8.19 myfile.txt
0
ответ дан 24 July 2018 в 18:38
  • 1
    десерт, вы не работаете правильно, потому что время может быть не совсем с 4 цифрами. – Yura Shinkarev 18 September 2017 в 14:15
  • 2
    @YShinkarev Почему ты не сказал это? Единственное, что вам нужно изменить, это KEYDEF, для которого я дал инструкции - например. -k 8.15,8.19 для 5 цифр. – dessert 18 September 2017 в 14:51
sort -k8V ex.txt

где

-k8V означает: ключ является 8-м полем, а критерии порядка - «sort version»

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

0
ответ дан 24 July 2018 в 18:38

sort -t " " -k 8 myfile.txt выводит на терминал желаемый результат. Вам не нужно использовать параметр -n, потому что поле, которое вы хотите отсортировать, не содержит только цифры.

0
ответ дан 24 July 2018 в 18:38
  • 1
    Может ли кто-нибудь сказать мне, почему мой ответ был подавлен? – M. Dm. 18 September 2017 в 16:08

sort принимает в качестве разделителя все, что вы ему даете, поэтому просто дайте ему правильную вещь:

sort -n -t "=" -k5

сортировать численно после четвертого =.

0
ответ дан 24 July 2018 в 18:38
  • 1
    Я сокращаю строку uri, он может содержать разные числа & quot; = & quot; :-( – Yura Shinkarev 18 September 2017 в 14:48

Другие вопросы по тегам:

Похожие вопросы: