web-dev-qa-db-ja.com

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

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

File1.txt 
foo

File2.txt
bar

File3.txt
qux

最終ファイルが次のようになるように連結します。

foo

bar

qux

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

foo
bar 
qux

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

104
neversaint

できるよ:

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

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

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

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

各ファイルをリストできる十分なファイルがない場合は、Bashで process substitution を使用して、ファイルの各ペアの間に改行を挿入できます。

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt
38

私がそれをやっていたら、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
33
Flexo

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

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

それが私がOsX 10.10.3でそれをした方法です

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

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

7
lbrutti

これはBashで機能します:

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
user3780389

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
3
user3780389