大容量テキストファイルを効率的にマージ/ソート/ユニーク

大容量テキストファイルを効率的にマージ/ソート/ユニーク

無邪気な努力をしています。

$ cat * | sort -u > /tmp/bla.txt

失敗:

-bash: /bin/cat: Argument list too long

したがって、(巨大な一時ファイルの生成)などの愚かな解決策を避けるには、次のようにします。

$ find . -type f -exec cat {} >> /tmp/unsorted.txt \;
$ cat /tmp/unsorted.txt | sort -u > /tmp/bla.txt

次のようにファイルを1つずつ処理できます(これにより、メモリ消費量が減り、ストリーミングメカニズムに近づきます)。

$ cat proc.sh
#!/bin/sh
old=/tmp/old.txt
tmp=/tmp/tmp.txt
cat $old "$1" | sort -u > $tmp
mv $tmp $old

以下は次のとおりです。

$ touch /tmp/old.txt
$ find . -type f -exec /tmp/proc.sh {} \;

もっとシンプルでUnixスタイルの代替案はありますか?cat * | sort -uファイル数に達したときMAX_ARG?これらの一般的な操作のために小さなシェルスクリプトを書くのは厄介です。

ベストアンサー1

少なくともBashでは動作する簡単な修正です。printf組み込みであり、コマンドライン引数制限が適用されないためです。

printf "%s\0" * | xargs -0 cat | sort -u > /tmp/bla.txt

echo * | xargsスペースなどを含むファイル名を処理する以外は機能します。)

おすすめ記事