繁体   English   中英

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

[英]Sorting a tab delimited file

我有以下格式的数据:

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 引用部分阅读它。

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

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

sort -k4nr file.txt

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

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

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

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

通过类似awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'类的管道来传输它。 这会将空格更改为制表符。

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

使用 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";

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

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

在双引号内键入制表符。

C:\>cat foo.bat

sort -k3 -t"    " tabfile.txt

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

如果您想让自己更轻松地只使用制表符,请将空格替换为制表符:

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

Lars Haugseth 的回答只能在命令行中为我工作,如果从 shell 脚本执行,它会给出这个错误:

排序:多字符制表符'$\t'

如果有人在看,如果它是在 shell 脚本中编码的,解决方案是

sort -t'    '

制表符在引号之间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM