我正面临一个巨大的 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)进行排序。
小智 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)
是使用特定列对具有数字字符的任何列表进行排序的正确命令
如果您将“列”理解为文本文件(第 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但很好地为示例服务。)