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

213

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

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

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

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

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

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

Ответы:

330

Вы можете использовать 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
Столкнулся с проблемой «неправильного» заказа. Обратите внимание на man "*** ПРЕДУПРЕЖДЕНИЕ *** Локаль, указанная средой, влияет на порядок сортировки. Установите LC_ALL=Cдля получения традиционного порядка сортировки, который использует собственные значения байтов". (для случая совпадения строк без -n)
x'ES
Это не учитывает пробелы в первом столбце и не работает, если после второго столбца больше столбцов, так как -k читается до конца строки. Предположим, что это файл TSV. Лучшее решениеsort -t$'\t' -k2 -n FILE
tuxErrante
вам может понадобиться указать разделитель, используя опцию -t
spectrum
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 - эта опция меняет порядок сортировки. Он также может быть записан как --reverse .
  • -i - эта опция игнорирует непечатаемые символы. Он также может быть записан как --ignore-nonprinting .
  • -b - эта опция игнорирует начальные пробелы, что удобно, так как пробелы используются для определения количества строк. Он также может быть записан как --ignore-lead-blank .
  • -f - эта опция игнорирует регистр букв «А» == «а». Он также может быть записан как --ignore-case .
  • -t [новый разделитель] - эта опция заставляет предварительную обработку использовать оператор, отличный от пробела. Он также может быть записан как --field-separator .

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

DCurro
источник
@ Анджело Этот ответ был, вероятно, опубликован спустя годы после того, как вы приняли ответ на этот вопрос, но рассматривали ли вы его как новый принятый ответ?
Джонатан Ю.
Вариант -tбыл реальным спасителем жизни! когда в ваших столбцах есть пробелы, а столбцы отличаются заданным символом, например ,или табуляцией
AKS
12

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

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

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

sort -t$'\t' -k2 -rn
Саурабх
источник
4

Использование sort.

sort ... -k 2,2 ...
Игнасио Васкес-Абрамс
источник
8
Вам также нужно использовать -n для сортировки по возрасту (числовая сортировка). В противном случае «11» будет предшествовать «2».
Мэтт Риял