sort コマンドは論理的な順序を理解します。

sort コマンドは論理的な順序を理解します。

sort -k 2 filename.txt は2番目のキーに基づいてソートするという意味ですが、次のコマンドの意味は何ですか? sort -k 3.3,3.5 このデータの場合: 例: I got this -->

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

「3番目のフィールドの3番目から5番目の文字の部分文字列でソート」を意味しますが、フィールドの前の最初のスペースから次のように計算が始まりますman sort

KEYDEF は開始位置と停止位置を表す F[.C][OPTS][,F[.C][OPTS]] です。ここで、Fはフィールド番号、Cはフィールドの文字位置です。どちらも原点1で、停止位置はデフォルトで行末に設定されます。 -t と -b の両方が有効でない場合、フィールドの文字は前のスペースの先頭から計算されます。

ソート順序へのロケールの影響を防ぐには、LC_ALL = Cでソートを実行してください。

もう1つの文字を追加すると、順序がどのように変わるかを確認してください。

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

関連情報