5ファイルの内容をそのまま1ファイルにコピーしたい。ファイルごとにcpを使用して試してみました。ただし、前のファイルからコピーされた内容は上書きされます。私も試しました
paste -d "\n" 1.txt 0.txt
そしてそれはうまくいきませんでした。
スクリプトで、各テキストファイルの最後に改行を追加します。
例えば。ファイル1.txt、2.txt、3.txt。1,2,3の内容を0.txtに入れます
どうすればいいのですか ?
5ファイルの内容をそのまま1ファイルにコピーしたい。ファイルごとにcpを使用して試してみました。ただし、前のファイルからコピーされた内容は上書きされます。私も試しました
paste -d "\n" 1.txt 0.txt
そしてそれはうまくいきませんでした。
スクリプトで、各テキストファイルの最後に改行を追加します。
例えば。ファイル1.txt、2.txt、3.txt。1,2,3の内容を0.txtに入れます
どうすればいいのですか ?
回答:
出力ファイルへのcat
シェルリダイレクト(>
)を使用した(連結の略)コマンドが必要です
cat 1.txt 2.txt 3.txt > 0.txt
>>
して、1つのファイルを別のファイルに追加します。追加されたファイルは、出力ファイルを>
上書きします。改行について、ファイルの最初の文字として改行はあります1.txt
か?を使用od -c
して、最初の文字がであるかどうかを確認できます\n
。
{...}
にファイル名の一致の形式を受け入れます。そのため、おそらく引用符がスクリプトの内容を少し混乱させましたか?私はいつもこのようなものをls
シェルで使って作業してみます。コマンドが正しい場合は、そのままスクリプトにカットアンドペーストします。-x
スクリプトでこのオプションが役立つ場合もあります。このオプションは、実行前にスクリプト内の拡張されたコマンドをエコーします。
私のようにこの投稿にまだつまずく人のための別のオプションは、使用すること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
他の回答で説明されているように、カタログ化されたコンテンツを出力ファイルの最後に追加します。
*.txt
引用符で囲む必要があります(そうしないと、find
記述されているように、コマンド全体が役に立たなくなります)。もう1つの欠陥は、重大な誤解に起因します。実行されるコマンドは cat >> 0.txt {}
、ではなくcat {}
です。あなたのコマンドは実際には同等です{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(実際に何が起こっているのかを理解できるようにグループ化を追加しました)。もう一つの欠陥は、それがあるfind
ファイルを見つけるために起こっている0.txt
、とcat
と言って文句を言うでしょう入力ファイルが出力ファイルです。
>> output.file
されることをだれにも(自分も含めて)誘導しないように、コマンドの最後に置く必要があります。find
cat {} >> output.file
-exec cat {} +
に-exec cat {} \;
、の代わりにを使用して、の1つのインスタンスのみcat
が複数の引数で生成+
されるようにします(POSIXで指定されています)。
find . -type f -exec cat {} + >> outputfile.txt
ディレクトリが50 MBしかなかったのに、出力ファイルがGIGに成長を停止しない理由を理解できませんでした。それは私自身にoutputfile.txtを追加し続けたからです!したがって、そのファイルに正しい名前を付けるか、完全に別のディレクトリに配置して、これを回避してください。
特定の出力タイプがある場合は、次のようにします
cat /path/to/files/*.txt >> finalout.txt
file_1
、file_2
、... file_11
、ので、ファイルの並べ替え方法を自然な順序の。
別のオプションは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.txt
(wmerge.txt
!ではなく)書き込むことに注意してください。を使用w"merge.txt"
して、ファイル名の混乱を避け-n
、サイレント出力を行うことができます。
もちろん、ワイルドカードを使用してファイルリストを短くすることもできます。たとえば、上記の例のように番号付きファイルの場合、次のように中括弧で範囲を指定できます。
sed -n w"merge.txt" {1..3}.txt
元のファイルに印刷不可能な文字が含まれている場合、catコマンドを使用するとそれらは失われます。「cat -v」を使用すると、非印刷可能文字は可視の文字列に変換されますが、出力ファイルには、元のファイルの実際の非印刷可能文字は含まれません。ファイルの数が少ない場合、代替手段は、非印刷文字を処理するエディター(vimなど)で最初のファイルを開くことです。次に、ファイルの最後まで移動し、「:r second_file_name」と入力します。これにより、印刷されない文字を含む2番目のファイルが読み込まれます。同じことは、追加のファイルに対しても行うことができます。すべてのファイルを読み込んだら、「:w」と入力します。最終結果として、最初のファイルには、最初に実行された内容と、読み込まれたファイルの内容が含まれるようになります。