UNIX如何仅按一列排序?


47

我知道Unix 排序的-k选项允许我们按特定的列以及所有以下内容进行排序。例如,给定输入文件:

2 3
2 2
1 2
2 1
1 1

使用sort -n -k 1,我得到一个输出,该输出按第一列排序,然后按第二列排序:

1 1
1 2
2 1
2 2
2 3

但是,我想保持第二列的顺序,如下所示:

1 2
1 1
2 3
2 2
2 1

sort命令可能吗?

Answers:


64

试试看:

sort -s -n -k 1,1

-s禁用“最后手段”的排序,这对排序,这不是一个特定的键的一部分一切。

-k 1实际上并不意味着“本场和接下来的”在数字排序的情况下,你可以看到,如果你尝试排序的第二列。您只是看到去往其余部分的关系破裂。但是,通常,您需要指定仅对字段1 -k 1,1进行排序。


你是对的。这正是我所需要的。谢谢!

是否可以在这种输出上使用join?
MiNdFrEaK 2012年

@MiNdFrEaK:的要求join是输入要在要加入的字段上排序。因此,可以肯定的是,此输出在第一个字段上进行了排序,您可以加入该字段。
卡斯卡贝尔2012年

我有2个文件,一个文件有2列,另一个文件有1列。第二个文件使用-u排序。现在的任务是我需要将此列与第一个文件的第一列(未排序)连接在一起,那么语法是什么?这会工作吗?加入-j 1 file2.txt排序-s -n -k 1 file1.txt吗?
MiNdFrEaK 2012年

1
-k 1,1(即“ 1 ”的一部分)不起作用任何更好的我。有效的是-s -k 1-n如果您需要它。
Totor

10

要仅对第一列进行排序,您应该执行以下操作:

sort -n -s -k1,1

摘自Unix和Linux系统管理手册

sort接受键规范-k3(而不是-k3,3),但可能未达到您的期望。没有终止字段号,排序键继续到行尾


不适合我,我需要添加-s如Cascabel所指出的选项。
Jean Paul

@JeanPaul,您说得对,文档的标题为-s“此选项维护具有相同键的记录的原始记录顺序”。
tidbeck

2

提供的答案均不适合我。

双方sort -s -k 2 file1sort -n -k1,1做此文件中的其他排序:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

我只需要做这个确切的事情,并最终使用了shell循环。此解决方案可能不适用于非常大的文件,因为需要为已排序的列中的每个唯一值读取整个文件。

在这里,文件仅在第2列上排序。

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

卡斯卡贝尔(Cascabel)提出的答案正在奏效,但我认为您没有看懂。
Jean Paul
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.