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

cat myFile | sort -u -k3


就足够执行技巧了吗?

评论

请注意,您可以将其写为sort -u -k3
排序-u -k3 myFile,甚至

#1 楼

sort -k 3,3 myFile


将根据当前定义的排序顺序,假设列由空格序列(POSIX / C语言环境中的ASCII SPC和TAB字符)分隔,将显示按第三列排序的文件

请注意,列中包括前导空格(默认分隔符是从非空格到空格的过渡),这可以在不忽略空格的语言环境中有所作为为了进行比较,请使用-b选项忽略前导空格。

请注意,它是完全独立于shell的(所有shell都将解析该命令行相同,shell通常没有sort内置命令)。

-k 3将从第3列开始的行部分排序(包括前导空白)。在C语言环境中,由于空格和制表符位于所有可打印字符之前,因此通常获得与-k 3,3相同的结果(具有相同第三字段的行除外),

-u为如果有几行相同的排序(即排序键对相同的行进行排序(不一定等于相等)),则仅保留其中一行。

cat是连接的命令。

如果列之间用其他分隔符,则需要-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␠c␠d之前进行排序,在第二种情况下,因为排序键相同(␠c),所以最后一种比较是在a b c d之前将全数行a c 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


一旦我们忽略了空格,前三行的排序键是相同的(␠␠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语言环境中,␠cc之前排序,因为那里只有一遍,字符(然后是单个字节)根据其代码点值(其中空格的代码点比q4312079q小)进行排序。 />

评论


列以空格分隔,除了空格和制表符外,还可以包括其他字符(取决于语言环境)。

– jfs
2013年12月11日,0:23

不错,+ 1。您能解释一下3,3做什么吗?为什么不只是3个?

– terdon♦
2013年12月11日的1:04

@terdon,请参阅带有示例的扩展说明。

–StéphaneChazelas
2013年12月11日上午9:49

@ J.F.Sebastian,您是对的,答案已更新。

–StéphaneChazelas
2013年12月11日上午11:56

嗯,要使其仅在第3位排序,而不是其余部分,谢谢。

– terdon♦
2013年12月12日下午3:57

#2 楼

sort -t : -k 3 filename


,当定界符为:时,您需要按第三个字段对文件filename进行排序。

评论


好的答案:简单明了

–约瑟夫·克利穆克(Josef Klimuk)
20年9月7日在9:18

#3 楼

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

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


(相当于琐碎的ls -lS,但很好地举例说明了)。

评论


不,默认情况下,排序列以空格分隔,不是字符列,要在第三个字符列上进行排序,语法为:sort -k 1.3,1.3。 ls -l | -k5,5n排序大小。

–StéphaneChazelas
2013年12月10日14:30

awk解决方案正是我所需要的-轻松修改即可满足复杂的分类要求

– jchook
17年11月8日在2:48

#4 楼

sort -g -k column_number 


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

评论


使用-k已经很好地涵盖了,因此如果您解释了此命令的不同之处或更好之处将很有帮助。也许您还可以包括实际的列号,以解决OP的实际问题。

– Jeff Schaller♦
17年5月5日在9:52

这使我可以使用手册页:p“ -g,--general-numeric-sort,根据常规数值进行比较”,这是我在本例中需要的。

– joels
18年8月17日在18:42

#5 楼

您可以使用awk Velor库:

 #!/usr/local/bin/velour -f
{
  q[NR] = 
  z[NR] = q4312079q
}
END {
  a_sort_by(q, z)
  io_puts(q)
}
 


#6 楼

$ sort -k 1.3,1.3 myfile


如果文件没有分隔符,则将在第三列对myfile文件进行排序。

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 


排序的手册页:

[...]
-k,--key = POS1 [,POS2]
在POS1(起源1)处开始一个密钥,在POS2(结束处)结束的行)
[...]
POS是F [.C] [OPTS],其中F是字段编号,C是字段中的字符位置;两者都是起源1。如果-t和-b均无效,则将从前一个空格的开头开始计算字段中的字符。 OPTS是一个或多个单字母排序选项,它会覆盖该键的全局排序选项。如果没有给出键,则使用整行作为键。

对于--key = 1.3,1.3,您说只有一个字段(整行),并且您正在比较此字段的第三个字符位置。