CSVファイルを並べ替えると予期しない結果が発生する

CSVファイルを並べ替えると予期しない結果が発生する

以下のように4つの列を持つCSVファイルがあり、bash端末でファイル名を入力します。

Sile,Barhams,Female,[email protected]
Shae,Scotti,Male,[email protected]
Shae,Bonham,Female,[email protected]
Shay,Ert,Female,[email protected]
Simeon,Dearle,Male,[email protected]

希望の出力は次のとおりです。

Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

今、私は次のコードを試して、次のような結果を得ました。

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

誰かが私の2つの作品を説明し、希望の作品を入手する方法を説明できますか?私によると、最初の列に基づいてソートする最初のコードがあり、同じレートがある場合は、目的の出力を得るために安定したソートを指定しましたが、問題が何であるかわかりません。 2番目のコードで知りたいです。 「Sile」が上部にどのように現れるか。

答え1

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

-kフィールドが次を参照しているので、アイデアを得ることができます。スペースが分離されましたデフォルトでは、フィールドはShae,Female前にソートされますShae,Male

-tカンマを区切り文字として使用するように指示するオプションが必要です。

-t--field-separator=SEP
空白ではなく空白の代わりに SEP を空白に切り替えるために使用

$ cat "$file"  | cut -d, -f1,3 | sort -t, -k 1,1 -s
Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

ここでは、-nデータの数値に基づいてソートされます。しかし、ここには数値文字列はありません。数値以外のすべての文字列はゼロとして扱われます。したがって、実際には基本的な順序ルールはありません。使用すると、-s順序はそのまま残ります。それ以外の場合は、-sテキストsortの並べ替えに戻ってインポートします。一部結果。

答え2

奇妙な。このデータにパイプラインを適用すると、次の結果が得られます。

Sile
Shae
Shae
Shay
Simeon

パイプラインを詳しく見てみましょう。

cat filename | grep "^.\{0\}S" | cut -d, -f1,6 | sort -s -n -k1,1

まず、次のように単純化します。

grep "^S" filename | cut -d, -f1,6 | sort -s -n -k1,1

猫を望まない(時には「猫虐待」とも呼ばれる)、正規表現では、行の先頭の後に文字がゼロで、その後にSが来なければなりません。これはSで始まる行と同じです。

フィールドは2つだけですが、なぜフィールド1と6が削除されますか?そして、私は結果が2番目のフィールドを保存すると信じていません。何か変だが変な点は無視しましょうcut

数値ソートを実行します。ファイルに指定された番号がないため、-s順序は変更されません。削除-nおよび/または-s

関連情報