我有一份数据,格式如下:

foo<tab>1.00<space>1.33<space>2.00<tab>3

现在我试着根据最后一个字段对文件进行排序。 我尝试了以下命令,但它没有按我们预期的排序。

$ sort -k3nr file.txt  # apparently this sort by space as delimiter

$ sort -t"\t" -k3nr file.txt
  sort: multi-character tab `\\t'

$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt
  sort: multi-character tab `\\t'

正确的做法是什么?

下面是示例数据。


当前回答

我在使用“通用数字排序”时,在bash shell中的cygwin排序遇到了这个问题。如果我指定-t$'\t' -kFg,其中F是字段号,它就不起作用,但当我同时指定-t$'\t'和-kF,Fg(例如-k7,7g表示第7个字段)时,它就起作用了。-kF,Fg不带-t$'\t'是不行的。

其他回答

将它通过类似awk '{print print $1"\t"$2"\t"$3"\t"$4"\t"$5}'之类的东西进行管道处理。这将把空格改为制表符。

我在使用“通用数字排序”时,在bash shell中的cygwin排序遇到了这个问题。如果我指定-t$'\t' -kFg,其中F是字段号,它就不起作用,但当我同时指定-t$'\t'和-kF,Fg(例如-k7,7g表示第7个字段)时,它就起作用了。-kF,Fg不带-t$'\t'是不行的。

Lars Haugseth的答案只适用于我的命令行,如果从shell脚本执行,它会给出这个错误:

排序:多字符TAB ' $\t '

解决方案,如果它被编码在一个shell脚本,如果有人看

sort -t'    '

制表符位于引号之间。

排序-t "$(printf '\t')"适合我

默认情况下,字段分隔符是非空白到空白的过渡,所以tab应该可以正常工作。

但是,列的索引以1和0为底,所以您可能希望

sort -k4nr file.txt

按第4列按数字倒序排序file.txt。(虽然问题中的数据甚至有5个字段,所以最后一个字段将是索引5。)