Как `--key (-k)` работает с командой `sort`? - PullRequest
0 голосов
/ 28 сентября 2018

Из руководства по команде sort

   -k, --key=POS1[,POS2]
          start a key at POS1, end it at POS2 (origin 1)

Версии:

  • сортировка: GNU coreutils 5.93
  • ОС: MAC OSX 10.11.6
  • Bash: GNU bash 3.2.57(1)
  • Терминал: 2.6.1

Это не совсем помогает понять, как использовать эту опцию.Я видел такие шаблоны, как -k1 -k2 и -k1,2 (см. этот пост ), -k1.2 и -k1.2n (см. этот пост ) и -k3 -k1 -k4 (см. этот пост ).

Как работает флаг --key (-k) для команды sort?


У меня только смутноеИнтуиция о том, что можно сделать с помощью опции -k, но если удобно рассмотреть пример, я был бы рад, если бы вы рассмотрели численно (-n) сортировку следующего ввода по номерам, которые непосредственно следуют за словом «строка»».Если после слова «строка» две записи имеют одно и то же значение, то можно выполнить числовую сортировку по значению, которое следует за буквой «G».

H3_row24_G500.txt
H3_row32_G1000.txt
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt
H3_row68_G999.txt
H3_row68_G500.txt

Ожидаемый результат -

H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G500.txt
H3_row24_G999.txt
H3_row32_G1000.txt
H3_row68_G500.txt
H3_row68_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

. указывает начальную позицию в пределах одного поля.Вы хотите выполнить числовую сортировку по полям 2 (начиная с символа 4) и 3 (начиная с символа 2).Должно работать следующее:

sort -t_ -k2.4n -k3.2n tmp.txt
  • -t_ указывает разделитель полей
  • Первый ключ - 2.4n
  • Второй ключ, если первыйключи равны 3.2n

Технически, .txt является частью поля 3, но когда вы запрашиваете числовую сортировку, завершающие нецифровые символы игнорируются.

(Вернее, -k2.4,2n -k3.2,3n предотвращает включение каких-либо дополнительных полей в каждый ключ; я думаю, что более простая форма, показанная выше, работает, потому что любое перекрытие как бы "перезаписывается". n предотвращает обработку поля 3 само по себекак число, а поля 4 нет.)

0 голосов
/ 28 сентября 2018

Это на самом деле не вопрос программирования, но здесь идет речь:

Если вы используете сортировку GNU, желаемый результат может быть достигнут с помощью sort -V:

$ echo 'H3_row24_G500.txt
H3_row32_G1000.txt
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt
H3_row68_G999.txt
H3_row68_G500.txt' | sort -V
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G500.txt
H3_row24_G999.txt
H3_row32_G1000.txt
H3_row68_G500.txt
H3_row68_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt

Это потому, что -V сравнивает числовые и общие строковые сегменты отдельно и H, 3, _row одинаковы во всех строках.

0 голосов
/ 28 сентября 2018

с man-страницы

   KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is a field number
   and C a character position in the field; both are origin 1, and the stop position defaults
   to  the  line's end.  If neither -t nor -b is in effect, characters in a field are counted
   from the beginning of the preceding whitespace.  OPTS is one or more single-letter  order‐
   ing options [bdfgiMhnRrV], which override global ordering options for that key.  If no key
   is given, use the entire line as the key.  Use --debug to diagnose incorrect key usage.

Смысл в том, что сортировка разбивает строки на поля.Разделитель периодов используется для смещения в поле.С _ в качестве разделителя вы бы использовали смещение 4.

В этом случае разделитель поля не является пробелом, поэтому вам необходимо указать его с помощью параметра -t.

сортировка по умолчанию использует поиск на основе локали и выглядит так, как будто вы хотите отсортировать их численно.Ключ -n делает это.

sort -t _ -k 2.4 -n 
...