Сортировка данных по второму столбцу файла

У меня есть файл из двух столбцов и n количества строк.

столбец 1 содержит names и столбец 2 age.

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

Результат должен отображать name самого молодого человека вместе с name, затем второго самого молодого человека и так далее ...

Любые предложения для однострочной оболочки или сценария bash.


person Angelo    schedule 22.06.2011    source источник
comment
Надмножество: настраиваемый разделитель: stackoverflow.com/questions/1037365/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 22.11.2015


Ответы (4)


Вы можете использовать команду 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
person Matt Ryall    schedule 22.06.2011
comment
также обратите внимание, что использование -h вместо -n будет сортировать удобочитаемые значения, такие как 2G или 3K, а также числа, разделенные запятыми, например 1,234.5 - person chillitom; 29.08.2018
comment
Возникла проблема с неправильным заказом. Обратите внимание на man *** ВНИМАНИЕ *** Локаль, заданная средой, влияет на порядок сортировки. Установите LC_ALL=C, чтобы получить традиционный порядок сортировки, в котором используются собственные байтовые значения. (для случая совпадения строк без -n) - person x'ES; 29.09.2018
comment
Это не учитывает пробелы в первом столбце и не работает, если есть еще столбцы после второго, поскольку -k читает до конца строки. Предположим, что это файл TSV, лучшим решением будет sort -t$'\t' -k2 -n FILE - person tuxErrante; 20.04.2019
comment
вам может потребоваться указать ваш разделитель с помощью опции -t - person spectrum; 19.09.2019

Решение:

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 - эта опция меняет порядок сортировки на обратный. Его также можно записать как --reverse.
  • -i - этот параметр игнорирует непечатаемые символы. Его также можно записать как --ignore-nonprinting.
  • -b - этот параметр игнорирует начальные пробелы, что удобно, поскольку пробелы используются для определения количества строк. Его также можно записать как --ignore-leading-blank.
  • -f - этот параметр игнорирует регистр букв. «А» == «а». Его также можно записать как --ignore-case.
  • -t [новый разделитель] - этот параметр заставляет предварительную обработку использовать оператор, отличный от пробела. Его также можно записать как --field-separator.

Есть и другие варианты, но это самые распространенные и полезные, которые я часто использую.

person DCurro    schedule 17.12.2015
comment
@Angelo Этот ответ предположительно был опубликован спустя годы после того, как вы приняли ответ на этот вопрос, но считали ли вы его новым принятым ответом? - person Jonathan Y.; 14.07.2017
comment
Вариант -t реально спасал жизнь !! когда в ваших столбцах есть пробелы, а столбцы отличаются заданным символом, например , или табуляцией - person AKS; 26.02.2020

Для значений, разделенных табуляцией, можно использовать приведенный ниже код.

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

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

sort -t$'\t' -k2 -rn
person Saurabh    schedule 20.03.2018

Используйте 1_.

sort ... -k 2,2 ...
person Ignacio Vazquez-Abrams    schedule 22.06.2011
comment
Вам также необходимо использовать -n для сортировки по возрасту (числовая сортировка). В противном случае «11» будет стоять перед «2». - person Matt Ryall; 22.06.2011