【问题标题】:Sorting data based on second column of a file根据文件的第二列对数据进行排序
【发布时间】:2011-09-20 07:12:57
【问题描述】:

我有一个包含两列和n 行数的文件。

第 1 列包含 names 和第 2 列 age

我想根据age(在第二列)按升序对该文件的内容进行排序。

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

关于单行 shell 或 bash 脚本的任何建议。

【问题讨论】:

标签: bash shell unix


【解决方案1】:

您可以使用sort commandkey 选项,它采用“字段编号”,所以如果您想要第二列:

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

【讨论】:

  • 还请注意,使用-h 而不是-n 将对人类可读的值进行排序,例如2G3K 以及用逗号分隔的数字,例如1,234.5
  • 面临“错误”订购的问题。注意 man "*** WARNING *** 环境指定的语言环境会影响排序顺序。设置LC_ALL=C 以获得使用本机字节值的传统排序顺序。" (对于没有-n的字符串匹配情况)
  • 如果第二列之后有更多列,这不考虑第一列中的空格,因为 -k 一直读取到行尾。假设它是一个 TSV 文件,更好的解决方案是 sort -t$'\t' -k2 -n FILE
  • 您可能需要使用 -t 选项指定分隔符
【解决方案2】:

解决方案:

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”==“一个”。也可以写成--ignore-case
  • -t [新分隔符] - 此选项使预处理使用除空格以外的运算符。也可以写成--field-separator

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

【讨论】:

  • @Angelo 这个答案大概是在你接受这个问题的答案几年后发布的,但你认为它是新接受的答案吗?
  • 选项-t 是真正的救星!!当您的列有空格并且列因给定字符(如, 或制表符)而不同时
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    使用sort

    sort ... -k 2,2 ...
    

    【讨论】:

    • 还需要使用-n来按年龄排序(数字排序)。否则 '11' 将出现在 '2' 之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多