156

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

File1.txt 
foo

File2.txt
bar

File3.txt
qux

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

foo

bar

qux

これの代わりにいつものcat File*.txt > finalfile.txt

foo
bar 
qux

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

4

7 に答える 7

154

できるよ:

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

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

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

awk 'FNR==1{print ""}1' *.txt > finalfile.txt
于 2011-11-18T13:36:17.880 に答える
36

もし私がそれをやっていたら、私は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
于 2011-11-18T13:41:10.173 に答える
11

これは Bash で機能します。

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

(append) での回答とは対照的に>>、このコマンドの出力は他のプログラムにパイプできます。

例:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt(括弧はオプションです)
  • for ... done | less(less へのパイプ)
  • for ... done | head -n -1(これにより、末尾の空白行が取り除かれます)
于 2016-11-10T19:56:40.933 に答える
8

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

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

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

于 2015-08-13T14:22:22.807 に答える
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
于 2016-11-10T20:12:27.520 に答える