Я сталкиваюсь с огромным файлом с 4 колонками. Я хотел бы отобразить отсортированный файл в stdout на основе его 3-го столбца:
cat myFile | sort -u -k3
Этого достаточно, чтобы выполнить трюк?
sort -u -k3 myFile
, даже
Я сталкиваюсь с огромным файлом с 4 колонками. Я хотел бы отобразить отсортированный файл в stdout на основе его 3-го столбца:
cat myFile | sort -u -k3
Этого достаточно, чтобы выполнить трюк?
sort -u -k3 myFile
, даже
Ответы:
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
разделены, которые могут включать другие символы в дополнение к пробелу и табуляции в зависимости от локали.
3,3
делает? Почему не просто 3
?
Если вы понимаете «столбец», как в текстовом файле (4-й символ), тогда да, ваше решение должно работать (или даже sort -u -k3 myFile
позволить sort
выполнять магию, сохраняющую память, с произвольным доступом). Если вы понимаете «столбец» как в базе данных - целая сущность данных, за которой следует разделитель, и переменная ширина столбца, вам понадобится что-то более изощренное, например, это сортирует ls -l по размеру
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(что эквивалентно тривиальному, ls -lS
но хорошо служит примером.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
отсортировать по размеру.
awk
Решение именно то , что я needed-- легко изменен , чтобы соответствовать требованиям комплекса сортировки
sort -g -k column_number
правильная команда для сортировки любого списка, имеющего числовые символы, используя определенный столбец
Вы можете использовать библиотеку awk Velor :
#!/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
справочная страница вида:
[...] -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
.