web-dev-qa-db-ja.com

shell-cat-ファイルの内容を1つの大きなファイルにマージします

私は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を超えるファイルに対しては実行できません!

ご支援いただきありがとうございます!

11
fabioln79

問題は、bigfileを同じディレクトリに配置するため、*の一部になることです。だから何かのような

cat dir/* > bigfile

fileN.txtファイルはdir/にあり、希望どおりに機能するはずです。

22
mvds

出力ファイルを同じディレクトリに保持できます。*よりも少し洗練されている必要があります。

shopt -s extglob
cat !(bigfile.txt) > bigfile.txt
4
glenn jackman

質問を読み直すと、データを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に書き戻すことができます。

4
chepner

もう1つの方法は、cat file1.txt file2.txt ...などですが、1,000を超えるファイルに対しては実行できません。

これがxargsの目的です:

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt
2

これは古い質問ですが、それでもxargsを使用して別のアプローチを示します。

  1. 連結したいファイルをリストします

    ls | grep [パターン]>ファイルリスト

  2. viまたはcatを使用してファイルが正しい順序になっていることを確認します。接尾辞(1、2、3、...、N)を使用する場合、これは問題ありません。

  3. 最終ファイルを作成します

    猫のファイルリスト| xargs cat >> [最終ファイル]

  4. ファイルリストを削除する

    rm-fファイルリスト

これが誰かに役立つことを願っています

1
Alwin Kesler