Сортировка на основе третьего столбца

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

cat myFile | sort -u -k3

Достаточно ли этого для выполнения трюка?

Комментарии к вопросу (2)
Решение
sort -k 3,3 myFile

отобразит файл, отсортированный по столбцу 3rd, предполагая, что столбцы разделены последовательностями пробелов (символы ASCII SPC и TAB в локали POSIX/C), в соответствии с порядком сортировки, определенным текущей локалью.

Обратите внимание, что ведущие пробелы включены в столбец (разделителем по умолчанию является переход от пробела к пробелу), что может иметь значение в локалях, где пробелы не игнорируются для целей сравнения, используйте опцию -b для игнорирования ведущих пробелов.

Обратите внимание, что это совершенно не зависит от оболочки (все оболочки будут анализировать эту командную строку одинаково, оболочки обычно не имеют встроенной команды sort).

-k 3 - это сортировка по части строк, начинающихся со столбца 3rd (включая ведущие пробелы). В локали C, поскольку символы пробела и табуляции стоят перед всеми печатаемыми символами, это даст тот же результат, что и -k 3,3 (за исключением строк, имеющих одинаковое третье поле),

-u - это сохранение только одной из строк, если есть несколько строк, которые сортируются одинаково (то есть когда ключ сортировки сортирует одинаково (это не обязательно то же самое, что быть одинаковым)).

cat - это команда для concatenate. Здесь она не нужна.

Если столбцы разделены чем-то другим, вам понадобится опция -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␠d, во втором случае, поскольку ключ сортировки одинаковый (␠c), сравнение последней инстанции, которое сравнивает строки полностью, ставит a b c d перед a c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Когда мы игнорируем пробелы, ключ сортировки для первых трех строк одинаковый (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).

Комментарии (7)

Если вы понимаете "столбец" как текстовый файл (4-й символ), то да, ваше решение должно работать (или даже sort -u -k3 myFile, чтобы позволить sort выполнять некоторые магические действия по экономии памяти при случайном доступе). Если вы понимаете "столбец" как базу данных - целая единица данных, за которой следует разделитель, и переменная ширина столбца, то вам понадобится что-то более сложное, например, сортировка ls -l по размеру.

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

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

Комментарии (2)
sort -g -k column_number 

это правильная команда для сортировки любого списка с числовыми символами по определенному столбцу.

Комментарии (2)
sort -t : -k 3 filename

когда ваш разделитель : и вам нужно отсортировать файл "имя файла" в 3<суп>РД</с SUP> В поле.

Комментарии (0)

Можно использовать на awk библиотека велюр:

в

#!/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 

страницы сортировки:

[...] -к ... ключ=POS1[,POS2] запустить ключ в POS1 (происхождения 1), конец его в POS2 (по умолчанию конец строки) [...] POS является Ф[.С][ОПЦ], где F-поле и С положение символа в поле, как происхождение 1. Если ни -Т, ни -в силу, символов в поле отсчитываются от начала предыдущего пробелом. ОПЦ-это один или несколько однобуквенные варианты заказа, которые переопределяют глобальные параметры заказ для этого ключа. Если ключ не дали, используйте всю строку в качестве ключа.

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

Комментарии (0)