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

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,这将达到目的:

$ sort -t$'\t' -k3 -nr file.txt

注意单引号字符串前面的美元符号。你可以读到 它在bash手册页的ANSI-C引用部分。

其他回答

你需要在-t\后面加一个制表符,在shell中按下ctrl-v,然后再按制表符。我使用过的大多数shell都支持这种文字选项卡条目模式。

但是要注意,从另一个地方复制和粘贴通常不会保留制表符。

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

美元的解决方案对我不起作用。 然而,通过实际将制表符本身放在命令中: 排序-t " -k2

我想在Windows上为Gnu排序提供一个解决方案,但是上面的解决方案都不能在命令行上为我工作。

使用Lloyd的线索,下面的批处理文件(.bat)对我有用。

在双引号内键入制表符。

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt

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

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

sort -k4nr file.txt

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