根据第三列排序

use*_*398 182 sort files

我正面临一个巨大的 4 列文件。我想根据第 3 列在标准输出中显示排序的文件:

cat myFile | sort -u -k3
Run Code Online (Sandbox Code Playgroud)

这足以执行这个技巧吗?

Sté*_*las 230

sort -k 3,3 myFile
Run Code Online (Sandbox Code Playgroud)

将显示该文件排序由3列假设由坯件(在POSIX / C区域设置ASCII SPC和TAB字符)的序列被分离的列,根据由当前区域定义排序顺序。

请注意,前导空格包含在列中(默认分隔符是从非空白到空白的过渡),这可以在不忽略空格以进行比较的区域设置中产生差异,使用-b选项忽略领先的空白。

请注意,它完全独立于外壳程序(所有外壳程序都会以相同的方式解析该命令行,外壳程序通常没有sort内置命令)。

-k 3是进行排序开始于3线的部分RD柱(包括前导空白)。在 C 语言环境中,因为空格和制表符排在所有可打印字符之前,所以通常会给你相同的结果-k 3,3(除了具有相同第三个字段的行),

-u如果有几行相同的排序(即排序键排序相同的地方(不一定与相等相同)),则只保留其中的一行。

cat是连接cat的命令。你在这里不需要它。

如果列被其他东西分隔,则需要-t指定分隔符的选项。

给定示例文件 a

$ cat a
a c c c
a b ca d
a b  c e
a b c d
Run Code Online (Sandbox Code Playgroud)

-u -k 3

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e
Run Code Online (Sandbox Code Playgroud)

第 2 行和第 3 行具有相同的第三列,但这里的排序键是从第三列到行尾,因此-u保留了两者。?ca?d排序之前,?c?c因为在我的语言环境中的第一遍中忽略空格,cad排序之前cc

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d
Run Code Online (Sandbox Code Playgroud)

对于第 3 列是 的那些,上面仅保留一个?c。请注意带有??c(2 个前导空格)的那个是如何保留的。

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d
Run Code Online (Sandbox Code Playgroud)

看看a b c d和的顺序是如何a c c c颠倒的。在第一种情况下,因为?c?csorts before ?c?d,在第二种情况下因为排序键是相同的 ( ?c),最后比较全行的比较方法 put a b c dbefore a c c c

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d
Run Code Online (Sandbox Code Playgroud)

一旦我们忽略空格,前 3 行的排序键是相同的 ( c),因此它们按最后的比较排序。

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d
Run Code Online (Sandbox Code Playgroud)

在 C 语言环境中,先??c排序,?c因为那里只有一个传递,其中字符(然后是单个字节)根据它们的代码点值(其中空格的代码点低于c)进行排序。

  • 不错,+1。你能解释一下`3,3`的作用吗?为什么不只是`3`? (4认同)

小智 17

sort -t : -k 3 filename
Run Code Online (Sandbox Code Playgroud)

当您的分隔符是:并且您需要filename第三个字段对文件进行排序时。


小智 7

sort -g -k column_number 
Run Code Online (Sandbox Code Playgroud)

是使用特定列对具有数字字符的任何列表进行排序的正确命令

  • 这让我使用了手册页:p“-g,--general-numeric-sort,根据一般数值进行比较”,这正是我的情况所需要的。 (2认同)

SF.*_*SF. 5

如果您将“列”理解为文本文件(第 4 个字符)中的“列”,那么是的,您的解决方案应该可以工作(甚至sort -u -k3 myFile允许sort通过随机访问执行一些节省内存的魔法)。如果您将“列”理解为数据库中的“列” - 整个数据实体后跟分隔符和可变列宽,您将需要一些更高级的东西,例如按大小对 ls -l 进行排序

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
Run Code Online (Sandbox Code Playgroud)

(这相当于平凡,ls -lS但很好地为示例服务。)

  • 不,默认情况下 sort _columns_ 是空格分隔的,它们不是字符列,要在第 3 个字符列上排序,语法将是:`sort -k 1.3,1.3`。`ls -l | sort -k5,5n` 对大小进行排序。 (5认同)