Сортировать по третьему столбцу

132

Я сталкиваюсь с огромным файлом с 4 колонками. Я хотел бы отобразить отсортированный файл в stdout на основе его 3-го столбца:

cat myFile | sort -u -k3

Этого достаточно, чтобы выполнить трюк?

user1058398
источник
4
Обратите внимание, что вы можете написать это как 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 по размеру

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(что эквивалентно тривиальному, ls -lSно хорошо служит примером.)

Научная фантастика
источник
5
Нет, по умолчанию сортировки столбцов являются пустыми разделены, они не являются символьные столбцы, для сортировки на 3 столбца символов, синтаксис будет выглядеть так : sort -k 1.3,1.3. ls -l | sort -k5,5nотсортировать по размеру.
Стефан Шазелас
awkРешение именно то , что я needed-- легко изменен , чтобы соответствовать требованиям комплекса сортировки
jchook
2
sort -g -k column_number 

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

Джаянт Кумар Джайн
источник
1
Использование -k уже рассматривалось довольно хорошо, поэтому было бы полезно, если бы вы объяснили, чем эта команда отличается или лучше. Может быть, вы могли бы также включить фактические номера столбцов для решения актуального вопроса ОП.
Джефф Шаллер
Это заставило меня использовать справочные страницы: p "-g, --general-numeric-sort, сравнить по общему числовому значению", что мне и было нужно в моем случае.
Joels
1

Вы можете использовать библиотеку awk Velor :

#!/usr/local/bin/velour -f
{
  q[NR] = $3
  z[NR] = $0
}
END {
  a_sort_by(q, z)
  io_puts(q)
}
Стивен Пенни
источник
0
$ sort -k 1.3,1.3 myfile

Сортирует ваш файл myfile по третьему столбцу, если в вашем файле нет разделителя.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

справочная страница вида:

[...] -k, --key = POS1 [, POS2] начинать ключ с POS1 (начало 1), заканчивать его с POS2 (конец строки по умолчанию) [...] POS это F [.C] [ OPTS], где F - номер поля, а C - позиция символа в поле; оба являются источником 1. Если ни -t, ни -b не действуют, символы в поле считаются с начала предыдущего пробела. OPTS - это одна или несколько однобуквенных опций заказа, которые переопределяют глобальные опции заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа.

С --key = 1.3,1.3, вы сказали, что есть только одно поле (вся строка) и что вы сравниваете позицию третьего символа этого поля.

Franck
источник