3番目の列に基づいて並べ替え


132

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

cat myFile | sort -u -k3

トリックを実行するのに十分ですか?


4
これをとして書くことができることに注意してくださいsort -u -k3 < myFile
-gerrit

6
としてsort -u -k3 myFile、偶数
セバスチャングラフ

回答:


168
sort -k 3,3 myFile

現在のロケールで定義されたソート順に従って、列が空白(POSIX / CロケールのASCII SPCおよびTAB文字)で区切られていると仮定して、3 番目の列でソートされたファイルを表示します。

列に先頭の空白が含まれていることに注意してください(デフォルトのセパレータは非空白から空白への移行です)。比較のためにスペースが無視されないロケールで違いが生じる可能性があるため、-b無視するオプションを使用します先行ブランク。

シェルから完全に独立していることに注意してください(すべてのシェルは同じコマンド行を解析しますが、シェルには一般にsortコマンドが組み込まれていません)。

-k 33 列から始まる行の部分(先頭の空白を含む)でソートします。Cロケールでは、スペース文字とタブ文字がすべての印刷可能文字の前にランク付けされるため、通常は同じ結果が得られます-k 3,3(同じ3番目のフィールドを持つ行を除く)。

-uいくつかある場合、ソート同様にその一つだけの行のを保持することである(つまり、ここで(すなわち、必ずしも同じではないソートキーソート同じ等しいです))。

cat詐欺へのコマンドである猫の enate。ここでは必要ありません。

列が何か別のもので区切られている場合、-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ため、前にソートされます。cad前にソートされますcc

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

3列目がの場合、1つだけが保持されます␠c␠␠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 dとの順序a c c cが逆になっている様子をご覧ください。最初のケースでは、␠c␠c␠c␠dにソートされるため、2番目のケースでは、ソートキーが同じ(␠c)であるため、フルプットの行を比較する最後の手段の比較はa b c dbeforeになりa c 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ロケールでは、文字(1バイト)がコードポイント値に基づいてソートされる場所(スペースのコードポイントがより小さい)でパスが1つしかないため、␠␠c前にソートします。␠cc


列は-でblank区切られ、ロケールに応じて、スペースとタブに加えて他の文字を含めることができます。
jfs

1
いいですね、+ 1。何ができるのか説明してもらえます3,3か?どうして3
テルドン

@terdon、例付きの詳細な説明を参照してください。
ステファンシャゼル

@JFSebastian、あなたは正しい、更新された答え。
ステファンシャゼル

ああ、残りの行ではなく、3日にのみ並べ替えてくれてありがとう。
テルドン

4

テキストファイル(4番目の文字)のように "列"を理解している場合は、ソリューションは動作します(またはランダムアクセスでメモリを節約する魔法を実行sort -u -k3 myFileできるようになりsortます)。データベースのように「列」を理解している場合-データのエンティティ全体にセパレータが続き、可変列幅がある場合、たとえばサイズによってls -lを並べ替えるなど、もっと手の込んだものが必要

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

(これは些細なことと同等ですls -lSが、例をうまく提供します。)


5
いいえ、デフォルトではソートは空白で区切られ、文字列ではありません。3番目の文字列でソートするには、構文は次のようになりますsort -k 1.3,1.3ls -l | sort -k5,5nサイズで並べ替えます。
ステファンシャゼル

awk解決策は、私は簡単に複雑なソート要件に合わせて変更needed--まさにです
jchook

2
sort -g -k column_number 

特定の列を使用して数字を含むリストを並べ替える正しいコマンドです


1
-kの使用についてはすでに十分に説明されているため、このコマンドの違いや改善点を説明しておくと役立ちます。OPの実際の質問に対処するために、実際の列番号を含めることもできます。
ジェフシャラー

これにより、マニュアルページ:p "-g、--general-numeric-sort、一般的な数値に従って比較"を使用するようになりました。これは私の場合に必要なものでした。
ジョエル


0
$ sort -k 1.3,1.3 myfile

ファイルに区切り文字がない場合、myfileファイルを3番目の列でソートします。

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

ソートのmanページ:

[...] -k、--key = POS1 [、POS2] POS1(原点1)でキーを開始し、POS2(デフォルトの行末)でキーを終了します[...] POSはF [.C] [ OPTS]、Fはフィールド番号、Cはフィールド内の文字位置です。両方とも原点1です。-tも-bも有効でない場合、フィールド内の文字は先行する空白の先頭からカウントされます。OPTSは1つ以上の単一文字の順序付けオプションで、そのキーのグローバルな順序付けオプションをオーバーライドします。キーが指定されていない場合は、行全体をキーとして使用します。

--key = 1.3,1.3では、フィールドが1つ(行全体)であり、このフィールドの3番目の文字位置を比較していると言いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.