巨大な4列のファイルに直面しています。 3番目の列に基づいて、ソートされたファイルをstdoutに表示したいと思います。
cat myFile | sort -u -k3
トリックを実行するのに十分ですか?
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
の前にソートされます。cad
はcc
の前にソートされます。
$ 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 d
とa 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
よりも低い)。
sort -t : -k 3 filename
区切り文字が:
で、ファイルfilename
を3でソートする必要がある場合rd フィールド。
テキストファイル(4番目の文字)のように「列」を理解していれば、はい、ソリューションは機能します(またはsort
がランダムアクセスでメモリ節約の魔法を実行できるようにするためにsort -u -k3 myFile
も)。データベースのように「列」を理解している場合-データのエンティティ全体の後に区切り文字が続き、列幅が可変である場合、より洗練されたものが必要になります。これはls -lをサイズでソートします
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(これはささいなls -lS
と同等ですが、例をうまく提供しています。)
sort -g -k column_number
特定の列を使用して、数字のリストを並べ替える適切なコマンドです
Awkを使用できます ベロアライブラリ :
#!/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はフィールド内の文字位置です。どちらもOrigin 1です。-tも-bも有効でない場合、フィールド内の文字は前の文字の先頭からカウントされます空白。OPTSは、そのキーのグローバルな順序オプションを上書きする1文字以上の順序オプションです。キーを指定しない場合は、行全体をキーとして使用してください。
--key = 1.3,1.3を使用すると、フィールドが1つだけ(行全体)あり、このフィールドの3番目の文字の位置を比較していると言いました。