对制表符分隔文件进行排序

nev*_*int 169 unix linux sorting tab-delimited

我有一个格式如下的数据:

foo<tab>1.00<space>1.33<space>2.00<tab>3
Run Code Online (Sandbox Code Playgroud)

现在我尝试逐渐根据最后一个字段对文件进行排序.我尝试了以下命令,但它没有像我们预期的那样排序.

$ 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'
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

这是样本数据.

Lar*_*eth 298

使用bash,这将解决这个问题:

$ sort -t$'\t' -k3 -nr file.txt
Run Code Online (Sandbox Code Playgroud)

注意单引号字符串前面的美元符号.您可以bash手册页ANSI-C引用部分中阅读它.

  • [使用](/sf/answers/87519561/) `'"'"'` 在别名中使用它。 (2认同)

laa*_*lto 10

默认情况下,字段分隔符为非空白到空白转换,因此选项卡应该可以正常工作.

但是,列是索引基数1和基数0,所以你可能想要

sort -k4nr file.txt
Run Code Online (Sandbox Code Playgroud)

按列4以相反顺序对file.txt进行数字排序.(虽然问题中的数据甚至有5个字段,所以最后一个字段是索引5).

  • 这仅适用于所有输入行的制表符分隔字段之间的空格字符数相同的情况. (4认同)
  • 糟糕的黑客通常不适用于字段中包含空格的有效 tsv 文件。不要用于生产! (4认同)

小智 5

您需要在 -t\ 之后放置一个实际的制表符,并在 shell 中执行此操作,您可以按 ctrl-v 然后按制表符。我使用过的大多数 shell 都支持这种文字制表符输入模式。

但是要小心,因为从另一个地方复制和粘贴通常不会保留选项卡。