4

“排序”正确地报告这两行是乱序的:

> echo "a b\na a" | sort -c 
sort: -:2: disorder: a a 

我如何告诉 sort 只比较每行的第一个字段?我试过了:

> echo "a b\na a" | sort -c -k1 
sort: -:2: disorder: a a 

但它失败了,如上所述。

我可以对每行的第一个字段进行排序,还是必须在比较它们之前使用 sed 之类的东西来修剪这些行?

编辑:我正在使用“排序(GNU coreutils)7.2”。我尝试使用不同的字段分隔符,但没有帮助:

> echo "a b\na a" | sort -k1 -c -t" "
sort: -:2: disorder: a a

尽管我很确定空格无论如何都是默认的分隔符。

4

1 回答 1

4

以下按预期工作:

echo "a b\na a" | sort -s -c -k1,1

您的排序调用存在两个问题:

  • to 参数-k是指定开始和结束位置的键定义。如果省略结束位置,则默认为行的最后一个字段,而不是开始字段。-k1,1指定两者,告诉sort不要在比较中包含第二个字段。

  • sort默认情况下是不稳定的,这意味着它不能保证不干扰比较相等的行的顺序。引用文档:

最后,作为所有键比较相等时的最后手段,sort比较整行,就好像没有指定除--reverse( -r) 之外的排序选项一样。( --stable)-s选项禁用此“最后的比较”,以便所有字段比较相等的行保留其原始相对顺序。

于 2013-07-07T19:36:53.240 回答