web-dev-qa-db-ja.com

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

巨大な4列のファイルに直面しています。 3番目の列に基づいて、ソートされたファイルをstdoutに表示したいと思います。

cat myFile | sort -u -k3

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

151
user1058398
sort -k 3,3 myFile

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

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

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

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

-uは、同じように並べ替える行が複数ある場合に1行だけを保持します(つまり、並べ替えキーが同じように並べ替えます(これは、必ずしもbeing equalと同じではありません))。

catは、con 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の前にソートされます。cadccの前にソートされます。

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

上記は、3番目の列が␠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 da c c cの順序が逆になっている方法を確認してください。最初のケースでは、␠c␠c␠c␠dの前にソートされるため、2番目のケースでは、ソートキーが同じ(␠c)であるため、完全に行を比較する最後の手段の比較では、a b c dの前に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ロケールでは、␠␠c␠cの前にソートされます。パスが1つしかなく、そこでは文字(次にシングルバイト)がコードポイント値に基づいてソートされます(スペースのコードポイントはcよりも低い)。

186
sort -t : -k 3 filename

区切り文字が:で、ファイルfilenameを3でソートする必要がある場合rd フィールド。

5
wiem fourati

テキストファイル(4番目の文字)のように「列」を理解していれば、はい、ソリューションは機能します(またはsortがランダムアクセスでメモリ節約の魔法を実行できるようにするためにsort -u -k3 myFileも)。データベースのように「列」を理解している場合-データのエンティティ全体の後に区切り文字が続き、列幅が可変である場合、より洗練されたものが必要になります。これはls -lをサイズでソートします

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

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

4
SF.
sort -g -k column_number 

特定の列を使用して、数字のリストを並べ替える適切なコマンドです

3

Awkを使用できます ベロアライブラリ

#!/usr/local/bin/velour -f
{
  q[NR] = $3
  z[NR] = $0
}
END {
  a_sort_by(q, z)
  io_puts(q)
}
1
Steven Penny
$ 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はフィールド内の文字位置です。どちらもOrigin 1です。-tも-bも有効でない場合、フィールド内の文字は前の文字の先頭からカウントされます空白。OPTSは、そのキーのグローバルな順序オプションを上書きする1文字以上の順序オプションです。キーを指定しない場合は、行全体をキーとして使用してください。

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

0
Franck