これは私のファイルです。最初の行はファイルの一部ではありません(行を含む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
GNUユーティリティは通常、単一文字オプションを単一のハイフンで構成されたグループに解析できます。
-n -r
これは、誤解を招く可能性があるオプションが-nr
ない場合にのみ適用されます。nr
sort は、
-k 4 -n -r
フィールド 4 をソートし、ファイルの各行を逆順にソートすることを意味します。ソートが完了し、5
2 つの -key 行が同じキー値に基づいてソートされると、行全体が次のようにソートされます。マニュアルページ:最後に、すべてのキーが同じであると判断された場合、最後の手段として sort は --reverse(-r) 以外のソートオプションが指定されていないかのように行全体を比較します。
…これがメアリーがデルタの前に現れた理由です。
代わりに使用する場合は、-k4nr
sort フィールド 4 を使用し、そのフィールドを逆順に並べ替えるように指示します。並べ替えが 5 と 5 の比較を終えると、2 つの (完全な) 行が通常の辞書順に並べ替えられます (ここにはグローバル句オプションがないためr
)、Delta が Mary の前に来ます。
答え2
コマンドに従ってオプションをグループ化できます。sort
そのうちの1つですが、以下で扱う出力を変更することもできます。
これは以下にも当てはまります。rm
rm -rf directory
同じことrm -r -f directory
2 つのコマンドが異なる順序を指定する理由について、最初のコマンドは 4 番目の列を key としてソートし、数値順にソートしてから-k 4
逆にします。 (実際にはn
4番目の列に数字のみが含まれているため、必要はありません。したがってsort -k 4 -r
同じ出力が提供されます。)その後、残りの列を逆順に並べ替えます。
2番目のコマンドはそれを組み合わせてから、4番目の列だけを逆順に並べ替えることで動作します。 4番目の列は同じキー値を持つため、最初の2つの列はアルファベット順に並べ替えられます。
この行を変更する場合:
Delta Cross 30 5
到着
Zelta Cross 30 5
これにより、2番目のコマンドでMaryで始まる行が最初に表示されます。