私は巨大な4列のファイルに直面しています。ソートされたファイルを3列目に基づいて標準出力に表示したい:
cat myFile | sort -u -k3
トリックを実行するのに十分ですか?
sort -u -k3 myFile
、偶数
私は巨大な4列のファイルに直面しています。ソートされたファイルを3列目に基づいて標準出力に表示したい:
cat myFile | sort -u -k3
トリックを実行するのに十分ですか?
sort -u -k3 myFile
、偶数
回答:
sort -k 3,3 myFile
現在のロケールで定義されたソート順に従って、列が空白(POSIX / CロケールのASCII SPCおよびTAB文字)で区切られていると仮定して、3 番目の列でソートされたファイルを表示します。
列に先頭の空白が含まれていることに注意してください(デフォルトのセパレータは非空白から空白への移行です)。比較のためにスペースが無視されないロケールで違いが生じる可能性があるため、-b
無視するオプションを使用します先行ブランク。
シェルから完全に独立していることに注意してください(すべてのシェルは同じコマンド行を解析しますが、シェルには一般にsort
コマンドが組み込まれていません)。
-k 3
3 列目から始まる行の部分(先頭の空白を含む)でソートします。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 d
beforeになり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
前にソートします。␠c
c
blank
区切られ、ロケールに応じて、スペースとタブに加えて他の文字を含めることができます。
3,3
か?どうして3
?
テキストファイル(4番目の文字)のように "列"を理解している場合は、ソリューションは動作します(またはランダムアクセスでメモリを節約する魔法を実行sort -u -k3 myFile
できるようになりsort
ます)。データベースのように「列」を理解している場合-データのエンティティ全体にセパレータが続き、可変列幅がある場合、たとえばサイズによってls -lを並べ替えるなど、もっと手の込んだものが必要
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(これは些細なことと同等ですls -lS
が、例をうまく提供します。)
sort -k 1.3,1.3
。ls -l | sort -k5,5n
サイズで並べ替えます。
awk
解決策は、私は簡単に複雑なソート要件に合わせて変更needed--まさにです
awk Velorライブラリを使用できます。
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ 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番目の文字位置を比較していると言いました。
sort -u -k3 < myFile
。