Сортування даних на основі другого стовпця файла


212

У мене є файл з двох стовпців і nкількості рядків.

стовпець 1 містить namesі колонку2 age.

Я хочу сортувати вміст цього файлу у порядку зростання на основі age(у другому стовпці).

Результат повинен відображати nameнаймолодшу людину разом із nameдругою молодшою ​​людиною тощо.

Будь-які пропозиції щодо одного вкладиша або сценарію bash.


1
Superset: призначений для користувача роздільник: stackoverflow.com/questions/1037365 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Відповіді:


329

Ви можете використовувати sortкоманду :

sort -k2 -n yourfile

-n, --numeric-sortпорівняйте за рядковим числовим значенням

Наприклад:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
також зауважте, що використання -hзамість -nбуде сортувати людиночитабельні значення, такі як 2Gчи 3K, а також числа, розділені комами, наприклад1,234.5
chillitom

Зіткнувся з проблемою із "неправильним" замовленням. Зверніть увагу на людину "*** ПОПЕРЕДЖЕННЯ *** Місцевість, вказана середовищем, впливає на порядок сортування. Встановіть, LC_ALL=Cщоб отримати традиційний порядок сортування, який використовує натільні значення байтів." (для випадку матчу рядків без -n)
x'ES

Це не враховує пробілів у першому стовпці і не працює, якщо після другого буде більше стовпців, оскільки -k читається до кінця рядка. Припустимо, що це файл TSV, краще рішенняsort -t$'\t' -k2 -n FILE
tuxErrante

Вам може знадобитися вказати роздільник, використовуючи опцію -t
спектр

85

Рішення:

sort -k 2 -n filename

більш багатослівно записується як:

sort --key 2 --numeric-sort filename


Приклад:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Пояснення:

  • -k # - цей аргумент вказує перший стовпець, який буде використовуватися для сортування. (зауважте, що стовпець тут визначається як поле з розділеним пробілом; аргумент -k5буде сортований починаючи з п’ятого поля у кожному рядку, а не з п’ятого символу у кожному рядку)

  • -n - ця опція вказує "числовий сортування", тобто колонка має бути інтерпретована як рядок чисел, а не текст.


Більше:

Інші поширені варіанти включають:

  • -r - ця опція скасовує порядок сортування. Він також може бути записаний як - зворотний .
  • -i - Цей параметр ігнорує символи, що не друкуються. Його також можна записати як --ignore-nonprint .
  • -b - Ця опція ігнорує провідні пробіли, що зручно, оскільки пробіли використовуються для визначення кількості рядків. Він також може бути записаний як -ignore-Lead-blanks .
  • -f - Цей параметр ігнорує регістр букв. "А" == "а". Він також може бути записаний як --ignore-case .
  • -t [новий роздільник] - Цей параметр змушує попередню обробку використовувати оператор, відмінний від місця. Він також може бути записаний як --field-separator .

Є й інші варіанти, але це найпоширеніші та корисні, якими я користуюсь часто.


@Angelo Ця відповідь, ймовірно, була розміщена через роки після того, як ви прийняли відповідь на це питання, але чи вважали ви її новою прийнятою відповіддю?
Джонатан Ю.

Варіант -tбув реальним збереженням життя !! коли у ваших стовпцях є пробіли, а стовпці відрізняються певним символом на зразок ,або вкладкою
AKS

12

Для розділених на вкладки значень може бути використаний код нижче

sort -t$'\t' -k2 -n

-r може використовуватися для отримання даних у порядку зменшення.
-n для числового сортування
-k, --key = POS1 [, POS2], де k - стовпець у файлі.
Для нижчого порядку нижче - код

sort -t$'\t' -k2 -rn

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