Я пытаюсь отсортировать свои данные по нескольким ключам с помощью сортировки unix. Я думаю, что получаю неправильный результат. Моя команда

sort -t "_" -k4,4 -k2 -k1,1g  < stdev.txt

И результат:

0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000110687417806       0.0346076270248
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat      0.000111161259827       0.0358869210331
0.321_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000134981044857       0.0457899948612
0.332_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    2.79712100925e-05       0.0049473335673
0.313_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.11625097814e-05       0.00588538959351
0.312_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.69066495111e-05       0.00819208397496
0.331_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    3.69774104969e-05       0.00824956236819
0.311_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    6.15395637079e-05       0.0173808578728
0.321_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.000138353320007       1.05986015585
0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.00017460061705        0.521775402243
0.311_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    0.000206502239096       0.149912367819
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat      0.000237775594814       0.633350656766
0.332_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    3.1779126554e-05        0.0128586399133
0.313_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    4.33297503265e-05       0.0166438194725
0.312_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    7.21521358641e-05       0.0342760190842
0.331_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap4.dat    7.52883193115e-05       0.0416052108611
...
0.3_rsrc:8_phi:0.5_abr:2_prof:plaw_diff:point.dat       0.000124446390455       0.00132402479772
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:lap2.dat        1.2638050496e-05        0.0289450596111
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:lap4.dat        0.000100909900236       0.170116521056
0.3_rsrc:8_phi:0.5_abr:2_prof:unif_diff:point.dat       0.000237686616486       0.00142895807647
  • Первый ключ читается правильно (все abr:2 в конце).
  • Второй ключ также читается правильно (diff:lap2 стоят перед diff:lap4).
  • Последний ключ -k1,1g читается неправильно . Согласно другому вопросу SO, он должен использовать только первый столбец (0.322, 0.3 и т. Д.) С общей числовой сортировкой. Что не выполняется (0,322> 0,3 в секторе lap2), и, к сожалению, в секторе lap4 порядок совсем другой. Командование

    echo -e '0.3\n0.32\n0.28' | sort -g
    

    дают правильный результат.

Можно ли изменить разделитель полей -t для каждого ключа сортировки -k?

1
Luuuucky 23 Ноя 2017 в 15:23

1 ответ

Лучший ответ

-k2 использует все символы от начала 2-го поля до конца строки, потому что вы не указали, где заканчивается ключ. Итак, строки

0.322_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat    0.000110687417806       0.0346076270248
0.3_rsrc:15_phi:0.5_abr:1_prof:gauss_diff:lap2.dat      0.000111161259827       0.0358869210331

Правильно отсортированы, потому что оба ключа начинаются с _rsrc:15 и 0.000110 сортируются до 0.000111. Ключевая фраза на странице руководства:

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

2
AlexP 23 Ноя 2017 в 12:49