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
没有工作。