根据文件的第二列对数据进行排序


212

我有两列和n行数的文件。

第1列包含names和column2 age

我想基于age(在第二列中)以升序对文件的内容进行排序。

结果应显示name最年轻的人name,然后显示第二个最年轻的人,依此类推...

关于一个线性shell或bash脚本的任何建议。


1
超级集:自定义分隔符:stackoverflow.com/questions/1037365/…–
西罗·桑蒂利

Answers:


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将对人类可读的值2G3K如以及以逗号分隔的数字)进行排序,例如1,234.5
chillitom

面临“错误”排序的问题。请注意man“ ***警告***环境指定的语言环境会影响排序顺序。设置LC_ALL=C为获取使用本机字节值的传统排序顺序。” (字符串匹配的情况下,而不-n
x'ES

如果-k一直读到行尾,则不会考虑第二列之后是否有更多列,因此第一列中的空格也不起作用。假设它是TSV文件,一个更好的解决方案是sort -t$'\t' -k2 -n FILE
tuxErrante 19'Apr

您可能需要使用-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-leading-blanks
  • -f-此选项忽略字母大小写。“ A” ==“ a”。也可以写成--ignore-case
  • -t [新分隔符] -此选项使预处理使用空格以外的运算符。它也可以写成--field-separator

还有其他选项,但是这些是我经常使用的最常见和有用的选项。


@Angelo可能是您接受此问题的答案数年后发布的答案,但是您是否认为它是新接受的答案?
Jonathan Y.

选项-t是真正的救星!当您的列中有空格并且列之间有给定字符(如,制表符)的差异时
AKS

12

对于制表符分隔的值,可以使用下面的代码

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

-r可用于按降序获取数据。
-n用于数字排序
-k,--key = POS1 [,POS2]其中k是文件中的列
对于下面的降序代码是

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.