2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

如何在UNIX中只用一列进行排序?

我知道Unix sort 的-k选项允许我们通过特定的列和以下所有进行排序。例如,给定输入文件

2 3
2 2
1 2
2 1
1 1

使用sort -n -k 1,我得到了一个按第1列和第2列排序的输出:

1 1
1 2
2 1
2 2
2 3

然而,我想保持第2列的排序,像这样:

1 2
1 1
2 3
2 2
2 1

使用sort命令可以吗?

答案 (3)

68
68
68
2009-08-31 16:28:27 +0000

试试这个。

sort -s -n -k 1,1

-s禁用了 “最后手段 "排序,即对所有不属于指定键的内容进行排序。

-k 1在数字排序的上下文中,实际上并不意味着 "这个字段和下面的所有字段",如果你尝试对第二列进行排序,你就会发现。你仅仅是看到了去行的其他部分打破了联系。然而,一般来说,你需要指定-k 1,1来仅对字段一进行排序。

10
10
10
2012-10-16 13:59:28 +0000

为了只对第一列进行排序,你应该这样做。

sort -n -s -k1,1

From Unix and Linux System Administration Handbook

sort接受键规范-k3(而不是-k3,3),但它可能没有达到你的预期。如果没有终止字段号,排序键就会一直持续到行的末尾。

2
2
2
2016-12-30 17:47:12 +0000

提供的答案对我来说一般都不适用。

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
``` 这里文件只在第2列进行排序。