Linux
排序命令理解邏輯順序
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