Изправен съм пред огромен файл с 4 колони. Бих искал да покажа сортирания файл в stdout въз основа на третата му колона:
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
По-горе се запазва само една за тези, при които третата колона е ␠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
След като пренебрегнем празните места, ключът за сортиране на първите три реда е един и същ (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
е правилната команда за сортиране на списък с цифрови символи по определена колона