Linux

排序命令理解邏輯順序

  • March 10, 2019

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 個十進制數字時,您如何對其進行排序?

假設輸入中沒有選項卡。該命令的解釋非常棘手:

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

引用自:https://unix.stackexchange.com/questions/345013