cat myFile | sort -u -k3
就足够执行技巧了吗?
#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
之前排序,因为在我的语言环境中的第一遍中空格被忽略,cad
在cc
之前排序。$ 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 d
和a 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语言环境中,
␠c
在c
之前排序,因为那里只有一遍,字符(然后是单个字节)根据其代码点值(其中空格的代码点比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,您说只有一个字段(整行),并且您正在比较此字段的第三个字符位置。
评论
请注意,您可以将其写为sort -u -k3排序-u -k3 myFile,甚至