複数のファイルの内容を1つのファイルに追加する方法


173

5ファイルの内容をそのまま1ファイルにコピーしたい。ファイルごとにcpを使用して試してみました。ただし、前のファイルからコピーされた内容は上書きされます。私も試しました

paste -d "\n" 1.txt 0.txt

そしてそれはうまくいきませんでした。

スクリプトで、各テキストファイルの最後に改行を追加します。

例えば。ファイル1.txt、2.txt、3.txt。1,2,3の内容を0.txtに入れます

どうすればいいのですか ?



回答:


307

出力ファイルへのcatシェルリダイレクト(>)を使用した(連結の略)コマンドが必要です

cat 1.txt 2.txt 3.txt > 0.txt

8
>>正しいはずですか?そして、なぜ私の0.txtファイルのすべてのテキストの前に改行があるのですか?
Steamの

1
0.txtの内容を保持しますか?
sehe 2013

13
@blasto場合によります。を使用>>して、1つのファイルを別のファイルに追加ます。追加されたファイルは、出力ファイルを> 上書きします。改行について、ファイルの最初の文字として改行はあります1.txtか?を使用od -cして、最初の文字がであるかどうかを確認できます\n
radical7 2013

1
@ radical7ありがとう。実際、私のファイルはfoo_1、foo_2、foo_3のようなものです。コードを-cat "$ filename _" {1,2,3} "。txt"として変更しようとしましたが、機能しませんでした。
Steam

1
@blastoあなたは間違いなく正しい方向に向かっています。Bashは確か{...}にファイル名の一致の形式を受け入れます。そのため、おそらく引用符がスクリプトの内容を少し混乱させましたか?私はいつもこのようなものをlsシェルで使って作業してみます。コマンドが正しい場合は、そのままスクリプトにカットアンドペーストします。-xスクリプトでこのオプションが役立つ場合もあります。このオプションは、実行前にスクリプト内の拡張されたコマンドをエコーし​​ます。
ラジカル7 2013

97

私のようにこの投稿にまだつまずく人のための別のオプションは、使用することfind -execです:

find . -type f -name '*.txt' -exec cat {} + >> output.file

私の場合、複数のサブディレクトリを調べるより堅牢なオプションが必要だったので、を使用することにしましたfind。それを分解する:

find .

現在の作業ディレクトリを確認します。

-type f

ファイルのみに関心があり、ディレクトリなどには関心がない

-name '*.txt'

結果セットを名前で整理する

-exec cat {} +

結果ごとにcatコマンドを実行します。「+」は、1つのインスタンスのみcatが生成されることを意味します(thx @gniourf_gniourf)

 >> output.file

他の回答で説明されているように、カタログ化されたコンテンツを出力ファイルの最後に追加します。


10
この回答には多くの欠陥があります。まず、ワイルドカードを*.txt引用符で囲む必要があります(そうしないと、find記述されているように、コマンド全体が役に立たなくなります)。もう1つの欠陥は、重大な誤解に起因します。実行されるコマンド cat >> 0.txt {}、ではなくcat {}です。あなたのコマンドは実際には同等です{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt(実際に何が起こっているのかを理解できるようにグループ化を追加しました)。もう一つの欠陥は、それがあるfindファイルを見つけるために起こっている0.txt、とcatと言って文句を言うでしょう入力ファイルが出力ファイルです
gniourf_gniourf 2014年

訂正ありがとうございます。私のケースは少し異なり、このケースに適用されるようないくつかの落とし穴については考えていませんでした。
mopo922 2014年

見つかったすべてのファイルに対して実行>> output.fileされることをだれにも(自分も含めて)誘導しないように、コマンドの最後に置く必要があります。findcat {} >> output.file
gniourf_gniourf 2014年

本当によく見え始めました!最後-exec cat {} +-exec cat {} \;、の代わりにを使用して、の1つのインスタンスのみcatが複数の引数で生成+されるようにします(POSIXで指定されています)。
gniourf_gniourf 2014年

3
良い答えと警告の言葉-私は私を次のように変更しました:find . -type f -exec cat {} + >> outputfile.txtディレクトリが50 MBしかなかったのに、出力ファイルがGIGに成長を停止しない理由を理解できませんでした。それは私自身にoutputfile.txtを追加し続けたからです!したがって、そのファイルに正しい名前を付けるか、完全に別のディレクトリに配置して、これを回避してください。
Thisisstackoverflow 2017年

43

特定の出力タイプがある場合は、次のようにします

cat /path/to/files/*.txt >> finalout.txt

1
ただし、マージ順序を維持する可能性が失われることに注意してください。たとえば、ファイルに名前を付けている場合、これが影響する可能性があります。file_1file_2、... file_11、ので、ファイルの並べ替え方法を自然な順序の。
emix

16

すべてのファイルが単一のディレクトリにある場合は、簡単に行うことができます

cat * > 0.txt

ファイル1.txt、2.txt、..は0.txtに入ります


Eswarはすでに回答しています。ただし、マージ順序を維持する可能性が失われることに注意してください。たとえば、ファイルに名前を付けている場合、これが影響する可能性があります。file_1file_2、... file_11、ので、ファイルの並べ替え方法を自然な順序の。
emix

10
for i in {1..3}; do cat "$i.txt" >> 0.txt; done

952個のファイルを1つに結合する必要があったため、このページを見つけました。多くのファイルがある場合、これははるかにうまく機能することがわかりました。これは、必要な数のループを実行し、それぞれを>>を使用して0.txtの末尾に追加することでcatします。


bashでブレース展開を使用してcat {1,2,3} .txt >> 0.txt
mcheema

9

すべてのファイルに同様の名前が付けられている場合は、次のようにするだけです。

cat *.log >> output.log

5

別のオプションはsed

sed r 1.txt 2.txt 3.txt > merge.txt 

または...

sed h 1.txt 2.txt 3.txt > merge.txt 

または...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

またはリダイレクトせずに...

sed wmerge.txt 1.txt 2.txt 3.txt

最後の行もmerge.txtwmerge.txt!ではなく)書き込むことに注意してください。を使用w"merge.txt"して、ファイル名の混乱を避け-n、サイレント出力を行うことができます。

もちろん、ワイルドカードを使用してファイルリストを短くすることもできます。たとえば、上記の例のように番号付きファイルの場合、次のように中括弧で範囲を指定できます。

sed -n w"merge.txt" {1..3}.txt

4

ファイルにヘッダーが含まれていて、それらを出力ファイルから削除したい場合は、以下を使用できます。

for f in `ls *.txt`; do sed '2,$!d' $f >> 0.out; done

3

元のファイルに印刷不可能な文字が含まれている場合、catコマンドを使用するとそれらは失われます。「cat -v」を使用すると、非印刷可能文字は可視の文字列に変換されますが、出力ファイルには、元のファイルの実際の非印刷可能文字は含まれません。ファイルの数が少ない場合、代替手段は、非印刷文字を処理するエディター(vimなど)で最初のファイルを開くことです。次に、ファイルの最後まで移動し、「:r second_file_name」と入力します。これにより、印刷されない文字を含む2番目のファイルが読み込まれます。同じことは、追加のファイルに対しても行うことができます。すべてのファイルを読み込んだら、「:w」と入力します。最終結果として、最初のファイルには、最初に実行された内容と、読み込まれたファイルの内容が含まれるようになります。


これはあまりスクリプト可能ではありません。
FKEinternet

1

3つのファイルの内容を1つのファイルに追加する場合は、次のコマンドが適切です。

cat file1 file2 file3 | tee -a file4 > /dev/null

すべてのファイルの内容をfile4に結合し、コンソール出力をにスローし/dev/nullます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.