sort 命令理解逻辑顺序

sort 命令理解逻辑顺序

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

相关内容