Я'сталкиваюсь с огромным файлом с 4 колонками. Я'хочу вывести отсортированный файл в stdout на основе его 3-го столбца:
cat myFile | sort -u -k3
Достаточно ли этого для выполнения трюка?
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
).
Если вы понимаете "столбец" как текстовый файл (4-й символ), то да, ваше решение должно работать (или даже sort -u -k3 myFile
, чтобы позволить sort
выполнять некоторые магические действия по экономии памяти при случайном доступе). Если вы понимаете "столбец" как базу данных - целая единица данных, за которой следует разделитель, и переменная ширина столбца, то вам понадобится что-то более сложное, например, сортировка ls -l по размеру.
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(что эквивалентно тривиальному ls -lS
, но хорошо подходит для данного примера).
sort -g -k column_number
это правильная команда для сортировки любого списка с числовыми символами по определенному столбцу.
sort -t : -k 3 filename
когда ваш разделитель :
и вам нужно отсортировать файл "имя файла" в 3<суп>РД</с SUP> В поле.
Можно использовать на awk библиотека велюр:
в
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ 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, вы сказали, что есть только одно поле (всей линейки) и что вы'вновь сравнивая положения третьего символа в этом поле.