Сортувати на основі третього стовпця


131

Я стикаюся з величезним файлом у 4 стовпці. Я хотів би відобразити відсортований файл у stdout на основі його 3-го стовпця:

cat myFile | sort -u -k3

Чи достатньо цього для виконання трюку?


4
Зауважте, що ви можете написати це як sort -u -k3 < myFile.
Герріт

6
Як sort -u -k3 myFile, навіть
Себастьян Граф

Відповіді:


166
sort -k 3,3 myFile

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

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

Зауважте, що вона абсолютно незалежна від оболонки (всі оболонки розбирали б цей командний рядок однаково; оболонки зазвичай не мають sortвбудованої команди).

-k 3- сортувати на ділянці рядків, починаючи з 3- го стовпця (включаючи провідні пробіли). У мові C, оскільки символи пробілу та вкладки стоять перед усіма символами для друку, це, як правило, дає такий же результат, як -k 3,3(за винятком рядків, що мають ідентичне третє поле),

-uполягає в тому, щоб зберегти лише один з рядків, якщо є кілька таких, що сортують однаково (саме там ключ сортування впорядковується однаково (це не обов'язково те саме, що рівне )).

catце команда con 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

@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 було охоплено досить добре, тому було б корисно, якби ви пояснили, наскільки ця команда відрізняється чи краще. Можливо, ви також можете включити фактичні номери стовпців для вирішення актуального питання ОП.
Jeff Schaller

Це змусило мене використати сторінки man: p "-g, - general-numeric-sor, порівняти за загальним числовим значенням", що було мені потрібно в моєму випадку.
joels


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 

man сторінка роду:

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

За допомогою --key = 1.3,1.3, ви сказали, що існує лише одне поле (весь рядок) і ви порівнюєте положення третього символу цього поля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.