ファイルを連結し、ファイル間に新しい行を挿入する


127

連結したいファイルが複数ありますcat。まあ言ってみれば

File1.txt 
foo

File2.txt
bar

File3.txt
qux

最終的なファイルが次のようになるように連結したい:

foo

bar

qux

通常のこれの代わりに cat File*.txt > finalfile.txt

foo
bar 
qux

それを行う正しい方法は何ですか?


回答:


121

できるよ:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

finalfile.txt上記のコマンドを実行する前に、ファイルが存在しないことを確認してください。

使用が許可されているawk場合は、次のことができます。

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

10
AWK '{print $0}' *.txt
ティマー

7
これには、最後(最初の選択肢から)または最初(2番目の選択肢)に空の行があるという明確な欠陥があります。awk 'FNR==1 && NR > 1 ...'代わりに、これで簡単にこれを防ぐことができます。
tripleee

5
>finalfile.txt後に置く場合はdone、追加する代わりに上書きできます。これにより、ループの前にファイルが欠落しているか空であることを確認する必要がなくなります。
トリプルリー


35

私がそれをやったのなら、sedを使用します。

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

このsedパターンでは、$には2つの意味があります。1つ目は(パターンを適用する行の範囲として)最後の行番号のみに一致し、2つ目は置換パターンの行の終わりに一致します。

sedのバージョンに-s(入力ファイルを個別に処理する)がない場合は、ループとしてすべて実行できます。

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

3
またはGNU sedの場合:sed -s '$G' *.txt > finalfile.txt
Ruud Helderman、

1つのストリームのみ!これは受け入れられる答えになるはずです!
Yassine ElBadaoui 2018

注意してくださいfind、の代わりに使用したため、PCがクラッシュしました*.txt。つまり、ファイルがそれ自体に追加されました。
Xerus

11

必要にxargs応じて使用することもできますが、主な考え方は同じです。

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

1
ありがとう。私xargsはbashのループよりもはるかに使いやすいと思います。
RawwrBag

9

これはバッシュで動作します:

for f in *.txt; do cat $f; echo; done

>>(追加)による回答とは異なり、このコマンドの出力は他のプログラムにパイプすることができます。

例:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (括弧はオプションです)
  • for ... done | less (少ないへのパイプ)
  • for ... done | head -n -1 (これにより、末尾の空白行が削除されます)

7

それは私がOsX 10.10.3でそれをやった方法です

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

パラメータのない単純な 'echo'コマンドは、新しい行が挿入されなかったためです。


これは文字列をファイルの最後に置きます。ファイル間に挿入するにはどうすればよいですか?
onassar

3

Pythonでは、これはファイル間の空白行と連結します(,余分な末尾の空白行の追加を抑制します):

print '\n'.join(open(f).read() for f in filenames),

シェルから呼び出すことができ、出力をファイルに出力する醜いpythonワンライナーは次のとおりです。

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.