私はbashを使用して、ファイルのリスト(1K以上)のコンテンツを大きなファイルにマージしようとしています。
次のcatコマンドを試しました。
cat * >> bigfile.txt
ただし、このコマンドが実行するのは、すでにマージされているものも含めて、すべてをマージすることです。
例えばfile1.txt
content1
file2.txt
content2
file3.txt
content3
file4.txt
content4
bigfile.txt
content1
content2
content3
content2
content3
content4
content2
でも欲しい
content1
content2
content3
content4
.txtファイル内
他の方法はcat file1.txt file2.txt ...
など...しかし、1,000を超えるファイルに対しては実行できません!
ご支援いただきありがとうございます!
問題は、bigfile
を同じディレクトリに配置するため、*
の一部になることです。だから何かのような
cat dir/* > bigfile
fileN.txt
ファイルはdir/
にあり、希望どおりに機能するはずです。
出力ファイルを同じディレクトリに保持できます。*
よりも少し洗練されている必要があります。
shopt -s extglob
cat !(bigfile.txt) > bigfile.txt
質問を読み直すと、データをbigfile.txt
に追加したいようですが、重複は追加していません。重複を除外するには、すべてをsort -u
に渡す必要があります。
sort -u * -o bigfile.txt
ソートする-o
オプションを使用すると、ファイルが出力で上書きされる前に、bigfile.txt
の内容を入力に安全に含めてソートできます。
編集:bigfile.txtがソートされていると仮定すると、2段階のプロセスを試すことができます。
sort -u file*.txt | sort -um - bigfile.txt -o bigfile.txt
まず、入力ファイルを並べ替えて、重複を削除します。その出力を別のsort -u
プロセスにパイプします。これは、-m
オプションも使用して、以前にソートされた2つのファイルをマージするようにsort
に指示します。マージする2つのファイルは、-
(標準入力、最初のsort
からのストリーム)とbigfile.txt
自体です。再び-o
オプションを使用して、入力として読み取った後、出力をbigfile.txt
に書き戻すことができます。
もう1つの方法は、cat file1.txt file2.txt ...などですが、1,000を超えるファイルに対しては実行できません。
これがxargsの目的です:
find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt
これは古い質問ですが、それでもxargs
を使用して別のアプローチを示します。
連結したいファイルをリストします
ls | grep [パターン]>ファイルリスト
vi
またはcat
を使用してファイルが正しい順序になっていることを確認します。接尾辞(1、2、3、...、N)を使用する場合、これは問題ありません。
最終ファイルを作成します
猫のファイルリスト| xargs cat >> [最終ファイル]
ファイルリストを削除する
rm-fファイルリスト
これが誰かに役立つことを願っています