20GBを並べ替えたいバイナリ30バイトのキーと20バイトの値が連続して配置されたファイル。すべてが一行にあります。ソートで比較に使用する必要があるキーの長さとレコードサイズを指定したいと思います。これにより、キーが移動したときにキーに関連する値も移動します。
理想的には、いかなる方法でもファイルを変更したくありません(たとえば、キーと値の間に区切り文字を追加するなど)。ファイルはKVKVKVKVKVKV
一行のバイナリファイルのように見えます。
20GBファイルの最初の200BのHexdump:
# hexdump -n 200 -C 20gbUnsorted
00000000 54 65 73 74 69 6E 67 31 32 33 65 08 00 60 83 6b |Testing123e..`.k|
00000010 39 2c d5 8b 8f 5e 55 96 18 55 e7 9b 87 f0 22 83 |9,...^U..U....".|
00000020 a4 66 b6 aa b1 f9 e0 ca cf 1e 26 b3 29 2a fd 10 |.f........&.)*..|
00000030 64 bb 18 b5 6a c0 7d 6f 65 6b 1d 2f 43 0d 57 bd |d...j.}oek./C.W.|
00000040 e7 e4 7d 81 f3 6a 6d d2 67 94 8b bc 23 97 bf e2 |..}..jm.g...#...|
00000050 8c 33 4e 4a d8 2b 8e 70 16 62 93 cf aa 01 16 bf |.3NJ.+.p.b......|
00000060 da 3b b1 ab 95 e0 e4 82 62 b3 ed fe 04 47 b5 7f |.;......b....G..|
00000070 77 b1 3a 35 87 fb e7 90 42 e3 c4 06 d6 8e 9f d2 |w.:5....B.......|
00000080 c7 f3 f6 39 0d 9d 0d ce 13 fb 83 42 e1 52 81 2e |...9.......B.R..|
00000090 99 4b 4b 40 3a 16 7a 2a 7c 93 c3 84 1d e1 93 0a |.KK@:.z*|.......|
000000a0 0d b2 07 f4 eb 9e 04 b5 9e d8 77 d9 a1 a0 67 a1 |..........w...g.|
000000b0 01 fa 8d 8d 4c 04 5b ee a3 00 6f b4 20 50 a4 e6 |....L.[...o. P..|
000000c0 5b b3 cc 40 83 eb b2 ad |[..@....|
000000c8
私はLinuxを使用しています。
ベストアンサー1
見苦しいですが正常に動作します。
hexdump -v -e '50/1 "%02x " "\n"' file.bin | sort | xxd -p -r > file-sorted.bin
hexdump
1行に50バイトずつグループ化し、そのsort
行に対して一般的な操作を実行しますxxd -r
。
最初の30バイトだけをソートすることには気にしません。なぜなら、同じ場合は順序が公開され、値を並べ替えることを続けて選択するからです。