我知道 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
sort 接受键指定 -k3(而不是 -k3,3),但它可能不会达到您的预期。如果没有终止字段编号,排序键将继续到行末
答案3
所提供的答案对我来说通常都不起作用。
并对此文件进行额外排序sort -s -k 2 file1
:sort -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