UNIX 如何仅按一列排序?

UNIX 如何仅按一列排序?

我知道 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命令可以实现吗?

答案1

尝试一下:

sort -s -n -k 1,1

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

在数字排序的上下文中,这-k 1实际上并不意味着“此字段和以下所有内容”,如果您尝试对第二列进行排序,就会看到这一点。您只是看到通过转到行的其余部分打破了平局。但是,一般来说,您需要指定-k 1,1要排序的仅有的在第一场。

答案2

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

sort -n -s -k1,1

Unix 和 Linux 系统管理手册

sort 接受键指定 -k3(而不是 -k3,3),但它可能不会达到您的预期。如果没有终止字段编号,排序键将继续到行末

答案3

所提供的答案对我来说通常都不起作用。

并对此文件进行额外排序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

相关内容