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