当第一列中的字符串重复时使用排序命令

当第一列中的字符串重复时使用排序命令

我有一个如下的数据文件;

ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99 
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

我需要根据第一列中的字符串对这些行进行排序,如下所示;

ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99 
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

但是当我执行时sort -k 1 data,我看到第二列中的数值按升序排序。哪个命令产生上述排序?

答案1

你需要做两件事。

第一的,sort -k 1 开始在键 1 处,但默认情况下停止在行末:进行排序仅有的在键 1 上,你需要-k 1,1

其次,默认情况下,GNUsort对整行执行最后的“最后手段”排序 - 为了抑制这种情况,您需要添加选项--stable

所以

$ sort --stable -k 1,1 data
ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

答案2

这将按第一列升序排序(通常),然后按第二列降序排序(反向)。第二列被解释为数字:

$ sort -k 1,1 -k 2nr,2 < in.txt
ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

您可能需要添加--debug标志来准确查看哪些键sort可进行操作:

$ sort --debug -k 1,1 -k 2nr,2 < in.txt
ALIC 5.55 2.65 3.45
____
     ____
___________________
ALIC 2.56 2.78 3.99
____
     ____
___________________
ALIC 1.00 1.00 1.00
____
     ____
___________________
...

相关内容