12

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 ...あります...しかし、1kファイルを超える場合はできません!

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

4

6 に答える 6

24

bigfile問題は、同じディレクトリに入れて、 *. だから何か

cat dir/* > bigfile

あなたのfileN.txtファイルがdir/

于 2012-05-24T12:10:40.670 に答える
4

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

shopt -s extglob
cat !(bigfile.txt) > bigfile.txt
于 2012-05-24T12:43:00.340 に答える
4

質問を読み直すと、データを に追加したいようですがbigfile.txt、重複を追加する必要はありません。sort -u重複を除外するには、すべてを通過させる必要があります。

sort -u * -o bigfile.txt

sortの-oオプションを使用するとbigfile.txt、ファイルが出力で上書きされる前に、 sort への入力に の内容を安全に含めることができます。

編集: bigfile.txt がソートされていると仮定すると、2 段階のプロセスを試すことができます。

sort -u file*.txt | sort -um - bigfile.txt -o bigfile.txt

まず、入力ファイルを並べ替え、重複を削除します。その出力を別のsort -uプロセスにパイプします。このプロセスでは、以前に並べ替えられた 2 つのファイルをマージ-mするように指示するオプションも使用します。sortマージする 2 つのファイルは-、(標準入力、最初の からのストリームsort) とbigfile.txtそれ自体です。-oこのオプションを再度使用して、出力bigfile.txtを入力として読み取った後に出力を書き戻すことができるようにします。

于 2012-05-24T12:30:39.897 に答える
2

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

これが xargs の目的です。

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt
于 2012-05-24T12:44:43.890 に答える
1

これは古い質問ですが、それでも別のアプローチを提供しますxargs

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

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

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

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

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

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

    rm -f ファイルリスト

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

于 2014-11-07T17:52:49.667 に答える
-3

試す:

cat `ls -1 *` >> bigfile.txt

現時点では、最初にテストするための unix マシンが手元にありません。

于 2012-05-24T12:12:37.410 に答える