基于第三列的排序

我面临一个巨大的4列文件。我想在stdout中根据第三列显示排序后的文件。

cat myFile | sort -u -k3

这样就能完成任务了吗?

解决办法
sort -k 3,3 myFile

将显示按3rd列排序的文件,假设各列由空白序列(POSIX/C地区的ASCII SPC和TAB字符)分隔,根据当前地区定义的排序顺序。

注意前面的空白是_包括在列中的(默认的分隔符是由非空白到空白的过渡),这在那些为了比较而不忽略空格的地区可能会产生差异,使用-b选项来忽略前面的空白。

注意,它完全独立于shell(所有的shell都会对该命令行进行相同的解析,shell一般没有内置的sort命令)。

-k 3是对以3rd列开始的行的部分进行排序(包括前面的空白)。在C语言中,由于空格和制表符排在所有可打印字符之前,这通常会得到与-k 3,3相同的结果(除了有相同第三字段的行)。

-u是在有几行排序相同的情况下,只保留其中一行(也就是排序键排序相同的情况下(这不一定与相等))。

cat'是连接的命令,它的作用是:strong>catenate。你在这里不需要它。

如果列是由其他东西分开的,你需要-t选项来指定分离器。

给出的例子文件 a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

-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

第2行和第3行有相同的第三列,但这里的排序键是从第三列到行末,所以-u保留了两者。␠ca␠d␠c␠c之前排序,因为在我所在的地区,第一遍时忽略了空格,cadcc之前排序。

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

上面那些第三列是␠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

请看a b c da c c c的顺序是如何颠倒的。在第一种情况下,因为␠c␠c排序在␠d之前,在第二种情况下,因为排序键相同(␠c),最后比较全行的比较法将a b c d放在a c c之前。

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

一旦我们忽略了空白,前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

在C语言中,␠␠c的排序在␠c之前,因为那里只有一个通道,字符(然后是单字节)根据其码位值排序(其中空格的码位比c低)。

评论(7)

如果你把"列"理解为文本文件(第4个字符),那么是的,你的解决方案应该是可行的(甚至可以用sort -u -k3 myFile来让sort执行一些随机访问的内存节省魔法)。如果你把 "列 "理解为数据库中的 "列"--一个完整的数据实体,后面有一个分隔符,并且列的宽度是可变的,那么你就需要一些更高级的东西,例如:按大小排序 ls -l

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(这相当于琐碎的 "ls -lS",但很好地服务于这个例子。)

评论(2)
sort -g -k column_number 

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

评论(2)