Unix用Tab分隔符sorting

我有以下格式的数据:

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

现在我试图按照最后一个字段的顺序逐步对文件进行sorting。 我尝试了下面的命令,但没有按照我们的预期sorting。

 $ 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 

注意单引号string前面的美元符号。 您可以在bash手册页的ANSI-C引用部分阅读它。

默认情况下,字段分隔符是非空白的空白转换,所以选项卡应该工作得很好。

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

 sort -k4nr file.txt 

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

你需要在-t \之后加上一个实际的制表符,然后在你用ctrl-v,然后是制表符的shell里做这个。 我使用的大多数shell都支持这种模式的文本标签条目。

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

通过类似于awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'东西来pipe道。 这将改变空格到制表符。

一般来说保持这样的数据不是一件好事,如果你可以避免的话,因为人们总是混淆标签和空格。

解决您的问题在Perl,Python或Ruby等脚本语言中非常简单。 以下是一些示例代码:

 #!/usr/bin/perl -w use strict; my $sort_field = 2; my $split_regex = qr{\s+}; my @data; push @data, "7 8\t 9"; push @data, "4 5\t 6"; push @data, "1 2\t 3"; my @sorted_data = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ ( split $split_regex, $_ )[$sort_field], $_ ] } @data; print "unsorted\n"; print join "\n", @data, "\n"; print "sorted by $sort_field, lines split by $split_regex\n"; print join "\n", @sorted_data, "\n"; 

$解决scheme不适合我。 但是,通过实际上将制表符本身放在命令中:sort -t“'-k2

我想在Windows上的Gnusorting解决scheme,但上述解决scheme没有在我的命令行上工作。

使用劳埃德的线索,下面的batch file(.bat)为我工作。

在双引号内键入制表符。

 C:\>cat foo.bat sort -k3 -t" " tabfile.txt 

在使用'general-numeric-sort'时,我遇到了这个问题,在一个bash shell的cygwin中sorting。 如果我指定了-t$'\t' -kFg ,其中F是字段号,它不起作用,但是当我同时指定-t$'\t'-kF,Fg (例如-k7,7g第七场),它确实工作。 -kF,Fg没有-t$'\t' -kF,Fg没有工作。