Попытка отсортировать на двух полях, вторых затем сначала

Позволить date сделайте работу!

date +%3j

Затем для миллидневной части простой прием должен вычислить 1000 плюс число миллидней и снять продвижение 1. Таким образом для Вашего сценария:

s=$(($(date +"%H*3600+%M*60+%S")))
t=$(($s * 5 / 432 + 1000))
date "+%Y'%3j'${t#1}"
107
14.04.2016, 23:31
2 ответа

Ключевая спецификация как -k2 средства взять все поля от 2 в конец строки во внимание. Так Villamor 44 заканчивается прежде Villamor 50. Так как эти два не равны, первое сравнение в sort -k2 -k1 достаточно должен отличить эти две строки и второй ключ сортировки -k1 не вызывается. Если два Villamors имели тот же возраст, -k1 заставил бы их быть отсортированными по имени.

К виду отдельным столбцом использовать -k2,2 как ключевая спецификация. Это означает использовать поля от № 2 до № 2, т.е. только второе поле.

sort -k2 -k3 <people.txt избыточно: это эквивалентно sort -k2 <people.txt. К виду фамилиями затем имена, затем возраст, выполняют следующую команду:

sort -k2,2 -k1,1 <people.txt

или эквивалентно sort -k2,2 -k1 <people.txt с тех пор существуют только эти три поля, и разделители являются тем же. На самом деле Вы получите тот же эффект от sort -k2,2 <people.txt, потому что sort использует целую строку как последнее прибежище, когда все ключи в подмножестве строк идентичны.

Также обратите внимание, что разделитель полей по умолчанию является переходом между непробелом и пробелом, таким образом, ключи будут включать начальные пробелы (в Вашем примере, для первой строки, первый ключ будет "Emily", но второй ключ " Bedford". Добавьте -b опция разделить те пробелы:

sort -b -k2,2 -k1,1

Это может также быть сделано на основе на ключ путем добавления b флаг в конце ключевой спецификации запуска:

sort -k2b,2 -k1,1 <people.txt

Но что-то для мысли: как только Вы добавляете один такой флаг к ключевой спецификации, глобальные флаги (как -n, -r...) больше не относятся к ним так, лучше постараться не смешивать флаги на ключ и глобальные флаги.

165
27.01.2020, 19:29
  • 1
    Вы закрепили его. Я принял (опасная вещь сделать), что определение-k1 будет означать поле 1 использования, где поле заканчивается в разделителе полей по умолчанию (пространство). Но поскольку Вы ясно указываете, k опция ожидает, что Вы укажете запуск и точки остановки ключа, который может или не может быть единственным полем. Ваше решение работает отлично, и что еще более важно, я ясен на том, почему оно делает так.Большое спасибо. –  Harry 26.10.2012, 10:40

С GNU sort Вы делаете это как это, не уверенное в MacOS:

sort -k2,2 -k1 <people.txt

Обновление согласно комментарию. Заключенный в кавычки из man sort:

   -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type

   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.
16
27.01.2020, 19:29
  • 1
    Вы могли объяснить эту странную нотацию? –  scai 24.10.2012, 15:19
  • 2
    Это получило меня думающий вдоль правильных строк - благодарит за это. Но не делайте необходимо указать точку остановки для второго-k. Это-k2,2-k1,1 иначе, точка остановки взята в качестве конца строки? –  Harry 26.10.2012, 10:45
  • 3
    @TonyBedford, корректный. Но определение положения остановки не изменит результат для Вашего текущего входа, но вызовет непротиворечивость в случае, если у Вас когда-либо будет несколько строк с идентичным полем 2 и 1. Таким образом, я предпочитаю позволять последнее -k включать столько, сколько это может. –  manatwork 26.10.2012, 11:01
  • 4
    @manatwork, Который не должен быть необходимым; если все указанные поля выдерживают сравнение равный, sort сравнит всю строку. Или с GNU sort можно использовать -s для стабильного вида. –  augurar 02.03.2015, 21:08

Теги

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