sort -k4nrとsort -k 4 -n -rが異なる結果を与えるのはなぜですか? [コピー]

sort -k4nrとsort -k 4 -n -rが異なる結果を与えるのはなぜですか? [コピー]

これは私のファイルです。最初の行はファイルの一部ではありません(行を含むFname ..)。

Fname Lname Age Children 
John  Doe   61  2
Mary  Jane  32  5
Delta Cross 30  5
Sui   Ace   24  1

このファイルに基づいてソートしたいと思います。子供の数。ほとんどの子供から最も少ない子供までソートする必要があります。

私のコマンドは次のとおりです。sort -k 4 -n -r file.txtこれは、4番目の列に基づいて並べ替え、数字で並べ替え、逆順で並べ替えることを意味します。これは以下を生成します。

Mary  Jane  32  5
Delta Cross 30  5
John  Doe   61  2
Sui   Ace   24  1

それが私の記事がすることですsort -k4nr file.txt。これには2つの質問があります。

まず、オプションを(一緒にリンクするのではなく)スペースで区切る必要があると思いました。ソートやどのコマンドにも該当しませんか?

次に、これを行うと、「正しい」順序が得られます。しかし、Deltaまず、次のような結果が得られます。

Delta Cross 30  5
Mary  Jane  32  5
John  Doe   61  2
Sui   Ace   24  1

なぜこれですか?

答え1

  1. GNUユーティリティは通常、単一文字オプションを単一のハイフンで構成されたグループに解析できます。-n -rこれは、誤解を招く可能性があるオプションが-nrない場合にのみ適用されます。nr

  2. sort は、-k 4 -n -rフィールド 4 をソートし、ファイルの各行を逆順にソートすることを意味します。ソートが完了し、52 つの -key 行が同じキー値に基づいてソートされると、行全体が次のようにソートされます。マニュアルページ:

    最後に、すべてのキーが同じであると判断された場合、最後の手段として sort は --reverse(-r) 以外のソートオプションが指定されていないかのように行全体を比較します。

…これがメアリーがデルタの前に現れた理由です。

代わりに使用する場合は、-k4nrsort フィールド 4 を使用し、そのフィールドを逆順に並べ替えるように指示します。並べ替えが 5 と 5 の比較を終えると、2 つの (完全な) 行が通常の辞書順に並べ替えられます (ここにはグローバル句オプションがないためr)、Delta が Mary の前に来ます。

答え2

コマンドに従ってオプションをグループ化できます。sortそのうちの1つですが、以下で扱う出力を変更することもできます。

これは以下にも当てはまります。rm

rm -rf directory同じことrm -r -f directory

2 つのコマンドが異なる順序を指定する理由について、最初のコマンドは 4 番目の列を key としてソートし、数値順にソートしてから-k 4逆にします。 (実際にはn4番目の列に数字のみが含まれているため、必要はありません。したがってsort -k 4 -r同じ出力が提供されます。)その後、残りの列を逆順に並べ替えます。

2番目のコマンドはそれを組み合わせてから、4番目の列だけを逆順に並べ替えることで動作します。 4番目の列は同じキー値を持つため、最初の2つの列はアルファベット順に並べ替えられます。

この行を変更する場合:

Delta Cross 30 5

到着

Zelta Cross 30 5

これにより、2番目のコマンドでMaryで始まる行が最初に表示されます。

関連情報