基于第三列的排序
我面临一个巨大的4列文件。我想在stdout中根据第三列显示排序后的文件。
cat myFile | sort -u -k3
这样就能完成任务了吗?
137
3
我面临一个巨大的4列文件。我想在stdout中根据第三列显示排序后的文件。
cat myFile | sort -u -k3
这样就能完成任务了吗?
将显示按3rd列排序的文件,假设各列由空白序列(POSIX/C地区的ASCII SPC和TAB字符)分隔,根据当前地区定义的排序顺序。
注意前面的空白是_包括在列中的(默认的分隔符是由非空白到空白的过渡),这在那些为了比较而不忽略空格的地区可能会产生差异,使用
-b
选项来忽略前面的空白。注意,它完全独立于shell(所有的shell都会对该命令行进行相同的解析,shell一般没有内置的
sort
命令)。-k 3
是对以3rd列开始的行的部分进行排序(包括前面的空白)。在C语言中,由于空格和制表符排在所有可打印字符之前,这通常会得到与-k 3,3
相同的结果(除了有相同第三字段的行)。-u
是在有几行排序相同的情况下,只保留其中一行(也就是排序键排序相同的情况下(这不一定与相等))。cat'是连接的命令,它的作用是:
strong>catenate。你在这里不需要它。如果列是由其他东西分开的,你需要
-t
选项来指定分离器。给出的例子文件
a
用
-u -k 3
。第2行和第3行有相同的第三列,但这里的排序键是从第三列到行末,所以
-u
保留了两者。␠ca␠d
在␠c␠c
之前排序,因为在我所在的地区,第一遍时忽略了空格,cad
在cc
之前排序。上面那些第三列是
␠c'的,只保留了一个。请注意,带有
␠␠c`(2个前导空格)的那个被保留了。请看
a b c d
和a c c c
的顺序是如何颠倒的。在第一种情况下,因为␠c␠c
排序在␠d
之前,在第二种情况下,因为排序键相同(␠c
),最后比较全行的比较法将a b c d
放在a c c
之前。一旦我们忽略了空白,前3行的排序键是相同的(
c
),所以它们被最后的比较方法排序。在C语言中,
␠␠c
的排序在␠c
之前,因为那里只有一个通道,字符(然后是单字节)根据其码位值排序(其中空格的码位比c
低)。如果你把"列"理解为文本文件(第4个字符),那么是的,你的解决方案应该是可行的(甚至可以用
sort -u -k3 myFile
来让sort
执行一些随机访问的内存节省魔法)。如果你把 "列 "理解为数据库中的 "列"--一个完整的数据实体,后面有一个分隔符,并且列的宽度是可变的,那么你就需要一些更高级的东西,例如:按大小排序 ls -l(这相当于琐碎的 "ls -lS",但很好地服务于这个例子。)
是使用特定列对任何有数字字符的列表进行排序的正确命令。