3列目を基準にしたソート

巨大な4カラムのファイルに直面しています。ソートされたファイルを3列目に基づいて標準出力に表示したいと思います。

cat myFile | sort -u -k3

これだけで十分な効果が得られるのでしょうか?

ソリューション
sort -k 3,3 myFile

と入力すると、3rdの列でソートされたファイルが表示されます。列はブランク(POSIX/CロケールではASCIIのSPCとTAB文字)のシーケンスで区切られていると仮定して、現在のロケールで定義されているソート順に従って表示されます。

先頭の空白は列に含まれることに注意してください(デフォルトのセパレータは非空白から空白への移行です)。

これはシェルとは完全に独立していることに注意してください (すべてのシェルがこのコマンドラインを同じように解析します。一般的にシェルは sort コマンドを内蔵していません)。

-k 3 は、3rd列で始まる行の部分(先頭の空白を含む)でソートします。Cロケールでは、スペースとタブの文字がすべての印刷可能な文字の前にランクされているので、一般的には -k 3,3 と同じ結果になります(ただし、3番目のフィールドが同一の行は除く)。

u` は、ソートが同じものがいくつかある場合に、そのうちの一つの行だけを保持することです (つまり、ソートキーが同じものをソートしている場合です (これは必ずしも be equal とは同じではありません)。

cat`は、concatenateするコマンドです。ここでは必要ありません。

カラムが何か他のもので区切られている場合には、-tオプションでセパレータを指定する必要があります。

ファイル a の例

$ cat a
a c c c
a b ca d
a b  c e
a b c d

-u -k 3`で。

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

2行目と3行目は同じ3列目ですが、ここでは3列目から行末までがソートキーとなるため、-uは両方を保持します。␠ca␠d␠c␠cの前にソートされます。私のロケールではスペースは最初のパスで無視されるので、cadcc` の前にソートされます。

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

上記では、3 列目が ␠c であるものは 1 つだけ保持されます。␠␠c` (2つの先行するスペース)のものが保持されることに注意してください。

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

a b c da c cの順序が逆になっているのを見てください。最初のケースでは␠c␠c␠dの前にソートされるので、2番目のケースではソートキーが同じ (␠c) なので、行全体を比較する最後の手段の比較ではa b c da c c` の前に置かれています。

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

空白を無視すると、最初の3行のソートキーは同じ(c)なので、最終手段の比較でソートされます。

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

Cロケールでは、␠␠c␠cの前にソートされます。これは、文字(その後シングルバイト)がコードポイント値(スペースはcよりも低いコードポイントを持つ)に基づいてソートされるという、1つのパスしかないからです。

解説 (7)

もし、"column"をテキストファイル(4番目の文字)として理解しているのであれば、あなたの解決策はうまくいくはずです(あるいは、sort -u -k3 myFileで、sortがランダムアクセスでメモリを節約する魔法をかけられるようにすることもできます)。もし、データベースのように列を理解しているなら、データの全体像の後にセパレータが続き、列の幅が可変であるため、より洗練されたものが必要になります。例えば、次のようにls -lをサイズ別にソートします。

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(これは、些細な ls -lS と同等ですが、この例ではうまく機能しています。)

解説 (2)
sort -g -k column_number 

は、数字を含むリストを特定の列でソートするのに適したコマンドです。

解説 (2)