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

时间:2009-06-24 09:39:14

标签: linux unix sorting tab-delimited

我有以下格式的数据:

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'

这样做的正确方法是什么?

这是sample data

11 个答案:

答案 0 :(得分:285)

使用 bash ,这将解决问题:

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

请注意单引号字符串前面的美元符号。你可以阅读 它在ANSI-C Quoting sections of the bash man page

答案 1 :(得分:10)

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

但是,列的索引为基数1和基数0,因此您可能需要

sort -k4nr file.txt

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

答案 2 :(得分:4)

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

请注意,因为从其他地方复制和粘贴通常不会保留标签。

答案 3 :(得分:3)

$解决方案对我不起作用。 但是,通过实际将选项卡字符本身放在命令中: sort -t'' - k2

答案 4 :(得分:1)

通过像awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'之类的东西来管道。这会将空格更改为标签。

答案 5 :(得分:1)

一般情况下,保存这样的数据并不是一件好事,如果你可以避免它,因为人们总是混淆标签和空格。

在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";

答案 6 :(得分:1)

我想在Windows上使用Gnu排序解决方案,但上述解决方案都没有在命令行上为我工作。

使用Lloyd的线索,以下批处理文件(.bat)为我工作。

在双引号内键入制表符。

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt

答案 7 :(得分:1)

sort -t "$(printf '\t')" 对我有用

答案 8 :(得分:0)

在使用'general-numeric-sort'时,我在bash shell中使用cygwin中的sort进行了这个问题。如果我指定-t$'\t' -kFg,其中F是字段编号,则它不起作用,但是当我同时指定-t$'\t'-kF,Fg时(例如-k7,7g表示第7个字段)它确实有效。没有-kF,Fg的{​​{1}}无效。

答案 9 :(得分:0)

如果您想通过仅使用标签让自己更容易,请用标签替换空格:

tr " " "\t" < <file> | sort <options>

答案 10 :(得分:0)

Laugs Haugseth的答案仅对我有用,如果从shell脚本执行,它将给出此错误:

排序:多字符标签“ $ \ t”

如果有人在寻找,则将其编码在shell脚本中的解决方案

sort -t'    '

制表符位于引号之间。