sort -k 2 filename.txt 意味着它按第二个键排序,但是以下命令意味着什么: sort -k 3.3,3.5 对于此数据: 例如:我得到了这个-->
Man in Winter England 1980.12.02
Richrd Fritz Scottland 1960.12.18
Max Winter GB 1955.12.09
Luther Arnold England 1990.05.12
Sebastian Kalle USA 1980.12.14
如何使用以下命令获取该列表的解决方案:sort -k 3.3,3.5 data.txt?
当你一般有 2 位小数时,你如何对其进行排序?
答案1
假设输入中没有选项卡。该命令的解释非常棘手:
sort -k3.3,3.5
表示“按第三个字段中第三个到第五个字符的子字符串进行排序”,但计数从该字段之前的第一个空格开始,如下所述man sort
:
KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 表示开始和停止位置,其中 F 是字段编号,C 是字段中的字符位置;两者都是原点 1,停止位置默认为线的末尾。如果 -t 和 -b 均无效,则字段中的字符从前面的空格的开头开始计数。
在 LC_ALL=C 下运行排序以避免区域设置影响排序顺序。
请注意如果再添加一个字符,顺序将如何变化,即
LC_ALL=C sort -k3.3,3.6
下面是一个简短的 Perl 脚本,显示了输入的哪一部分用于排序:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $field_index = 3;
my $start = 3;
my $stop = 5; # Change to 6 to explain the different order.
while (my $line = <>) {
chomp $line;
my @fields = $line =~ /(\s*\S*)/g;
my $length_before = 0;
$length_before += length $fields[$_] for 0 .. $field_index - 2;
my $from = $start - 1 + $length_before;
my $to = $stop + $length_before;
$_ > length $line and $_ = length $line for $from, $to;
substr $line, $to, 0, '>>';
substr $line, $from, 0, '<<';
say $line;
}
3.3、3.5 的输出:
Luther Arnold << >>England 1990.05.12
Man in << >>Winter England 1980.12.02
Max Winter << >>GB 1955.12.09
Richrd Fritz << >> Scottland 1960.12.18
Sebastian Kalle << >> USA 1980.12.14
3.3、3.6 的输出:
Richrd Fritz << >>Scottland 1960.12.18
Sebastian Kalle << >>USA 1980.12.14
Luther Arnold << E>>ngland 1990.05.12
Max Winter << G>>B 1955.12.09
Man in << W>>inter England 1980.12.02