Обратите внимание, что вы можете написать это как sort -u -k3 < myFile.
gerrit
6
Как sort -u -k3 myFile, даже
Себастьян Граф
Ответы:
168
sort -k 3,3 myFile
будет отображать файл, отсортированный по 3- му столбцу, при условии, что столбцы разделены последовательностями пробелов (символы ASCII SPC и TAB в локали POSIX / C) в соответствии с порядком сортировки, определенным текущей локалью.
Обратите внимание, что начальные пробелы включены в столбец (разделителем по умолчанию является переход от непустого к пустому), что может иметь значение в локалях, где пробелы не игнорируются для целей сравнения, используйте -bопцию игнорировать ведущие заготовки.
Обратите внимание, что он полностью независим от оболочки (все оболочки будут анализировать эту командную строку одинаково, в оболочке обычно нет sortвстроенной команды).
-k 3сортировка по части строк, начиная с 3- го столбца (включая начальные пробелы). В локали C, так как символы пробела и табуляции стоят перед всеми печатными символами, это, как правило, дает тот же результат, что и -k 3,3(за исключением строк, которые имеют идентичное третье поле),
-uсостоит в том, чтобы сохранить только одну из строк, если есть несколько, которые сортируют одинаково (то есть, где ключ сортировки сортирует то же самое (это не обязательно то же самое, что быть равным ).
catэто команда против кошки Enate. Вам это не нужно здесь.
Если столбцы разделены чем-то другим, вам нужно -tуказать разделитель.
Данный пример файла a
$ cat a
a c c c
a b ca d
a b c e
a b c d
С -u -k 3:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
Строки 2 и 3 имеют один и тот же третий столбец, но здесь ключ сортировки находится от третьего столбца до конца строки, поэтому -uсохраняются оба. ␠ca␠dсортирует до, ␠c␠cпотому что пробелы игнорируются при первом проходе в моей локали, cadсортировка до cc.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
Выше только один сохраняется для тех, где 3-й столбец ␠c. Обратите внимание, как ␠␠cсохраняется тот, у которого (2 ведущих пробела).
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
Посмотрите, как порядок a b c dи a c c cобратный. В первом случае, потому что ␠c␠cсортирует раньше ␠c␠d, во втором случае, потому что ключ сортировки тот же ( ␠c), последнее средство сравнения, которое сравнивает строки полностью, ставит a b c dперед a c c c.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
Как только мы проигнорируем пробелы, ключ сортировки для первых 3 строк будет одинаковым ( c), поэтому они сортируются по последнему сравнению.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
В локали C, ␠␠cсортировка до, так ␠cкак там только один проход, где символы (затем одиночные байты) сортируются на основе значения их кодовой точки (где пробел имеет более низкую кодовую точку, чем c).
столбцы blankразделены, которые могут включать другие символы в дополнение к пробелу и табуляции в зависимости от локали.
JFS
1
Ницца +1. Не могли бы вы объяснить, что 3,3делает? Почему не просто 3?
Тердон
@terdon, см. расширенное описание с примерами.
Стефан Шазелас
@JFSebastian, вы правы, ответ обновлен.
Стефан Шазелас
Ах, чтобы сделать это только на 3-й, а не на остальной линии, спасибо.
Тердон
4
Если вы понимаете «столбец», как в текстовом файле (4-й символ), тогда да, ваше решение должно работать (или даже sort -u -k3 myFileпозволить sortвыполнять магию, сохраняющую память, с произвольным доступом). Если вы понимаете «столбец» как в базе данных - целая сущность данных, за которой следует разделитель, и переменная ширина столбца, вам понадобится что-то более изощренное, например, это сортирует ls -l по размеру
Нет, по умолчанию сортировки столбцов являются пустыми разделены, они не являются символьные столбцы, для сортировки на 3 столбца символов, синтаксис будет выглядеть так : sort -k 1.3,1.3. ls -l | sort -k5,5nотсортировать по размеру.
Стефан Шазелас
awkРешение именно то , что я needed-- легко изменен , чтобы соответствовать требованиям комплекса сортировки
jchook
2
sort -g -k column_number
правильная команда для сортировки любого списка, имеющего числовые символы, используя определенный столбец
Использование -k уже рассматривалось довольно хорошо, поэтому было бы полезно, если бы вы объяснили, чем эта команда отличается или лучше. Может быть, вы могли бы также включить фактические номера столбцов для решения актуального вопроса ОП.
Джефф Шаллер
Это заставило меня использовать справочные страницы: p "-g, --general-numeric-sort, сравнить по общему числовому значению", что мне и было нужно в моем случае.
[...] -k, --key = POS1 [, POS2] начинать ключ с POS1 (начало 1), заканчивать его с POS2 (конец строки по умолчанию) [...] POS это F [.C] [ OPTS], где F - номер поля, а C - позиция символа в поле; оба являются источником 1. Если ни -t, ни -b не действуют, символы в поле считаются с начала предыдущего пробела. OPTS - это одна или несколько однобуквенных опций заказа, которые переопределяют глобальные опции заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа.
С --key = 1.3,1.3, вы сказали, что есть только одно поле (вся строка) и что вы сравниваете позицию третьего символа этого поля.
sort -u -k3 < myFile
.sort -u -k3 myFile
, дажеОтветы:
будет отображать файл, отсортированный по 3- му столбцу, при условии, что столбцы разделены последовательностями пробелов (символы ASCII SPC и TAB в локали POSIX / C) в соответствии с порядком сортировки, определенным текущей локалью.
Обратите внимание, что начальные пробелы включены в столбец (разделителем по умолчанию является переход от непустого к пустому), что может иметь значение в локалях, где пробелы не игнорируются для целей сравнения, используйте
-b
опцию игнорировать ведущие заготовки.Обратите внимание, что он полностью независим от оболочки (все оболочки будут анализировать эту командную строку одинаково, в оболочке обычно нет
sort
встроенной команды).-k 3
сортировка по части строк, начиная с 3- го столбца (включая начальные пробелы). В локали C, так как символы пробела и табуляции стоят перед всеми печатными символами, это, как правило, дает тот же результат, что и-k 3,3
(за исключением строк, которые имеют идентичное третье поле),-u
состоит в том, чтобы сохранить только одну из строк, если есть несколько, которые сортируют одинаково (то есть, где ключ сортировки сортирует то же самое (это не обязательно то же самое, что быть равным ).cat
это команда против кошки Enate. Вам это не нужно здесь.Если столбцы разделены чем-то другим, вам нужно
-t
указать разделитель.Данный пример файла
a
С
-u -k 3
:Строки 2 и 3 имеют один и тот же третий столбец, но здесь ключ сортировки находится от третьего столбца до конца строки, поэтому
-u
сохраняются оба.␠ca␠d
сортирует до,␠c␠c
потому что пробелы игнорируются при первом проходе в моей локали,cad
сортировка доcc
.Выше только один сохраняется для тех, где 3-й столбец
␠c
. Обратите внимание, как␠␠c
сохраняется тот, у которого (2 ведущих пробела).Посмотрите, как порядок
a b c d
иa c c c
обратный. В первом случае, потому что␠c␠c
сортирует раньше␠c␠d
, во втором случае, потому что ключ сортировки тот же (␠c
), последнее средство сравнения, которое сравнивает строки полностью, ставитa b c d
передa c c c
.Как только мы проигнорируем пробелы, ключ сортировки для первых 3 строк будет одинаковым (
c
), поэтому они сортируются по последнему сравнению.В локали C,
␠␠c
сортировка до, так␠c
как там только один проход, где символы (затем одиночные байты) сортируются на основе значения их кодовой точки (где пробел имеет более низкую кодовую точку, чемc
).источник
blank
разделены, которые могут включать другие символы в дополнение к пробелу и табуляции в зависимости от локали.3,3
делает? Почему не просто3
?Если вы понимаете «столбец», как в текстовом файле (4-й символ), тогда да, ваше решение должно работать (или даже
sort -u -k3 myFile
позволитьsort
выполнять магию, сохраняющую память, с произвольным доступом). Если вы понимаете «столбец» как в базе данных - целая сущность данных, за которой следует разделитель, и переменная ширина столбца, вам понадобится что-то более изощренное, например, это сортирует ls -l по размеру(что эквивалентно тривиальному,
ls -lS
но хорошо служит примером.)источник
sort -k 1.3,1.3
.ls -l | sort -k5,5n
отсортировать по размеру.awk
Решение именно то , что я needed-- легко изменен , чтобы соответствовать требованиям комплекса сортировкиправильная команда для сортировки любого списка, имеющего числовые символы, используя определенный столбец
источник
Вы можете использовать библиотеку awk Velor :
источник
Сортирует ваш файл myfile по третьему столбцу, если в вашем файле нет разделителя.
справочная страница вида:
[...] -k, --key = POS1 [, POS2] начинать ключ с POS1 (начало 1), заканчивать его с POS2 (конец строки по умолчанию) [...] POS это F [.C] [ OPTS], где F - номер поля, а C - позиция символа в поле; оба являются источником 1. Если ни -t, ни -b не действуют, символы в поле считаются с начала предыдущего пробела. OPTS - это одна или несколько однобуквенных опций заказа, которые переопределяют глобальные опции заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа.
С --key = 1.3,1.3, вы сказали, что есть только одно поле (вся строка) и что вы сравниваете позицию третьего символа этого поля.
источник