回答:
cat
ほとんどの人はファイルを標準出力に出力するためだけに使用しますが、これは技術的には「連結」することになっています。複数のファイル名を指定すると、それらはすべて順番に出力され、それを新しいファイルにリダイレクトできます。すべてのファイルの場合は*
(または/path/to/directory/*
ディレクトリにまだない場合)を使用すると、シェルはそれをすべてのファイル名に展開します
$ cat * > merged-file
numeric_glob_sort
オプションを設定できます)。
ファイルが同じディレクトリにない場合、連結の前にfindコマンドを使用できます。
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
ファイルがすでに順序付けられており、それらをマージして分析する場合に非常に便利です。
より移植性の高い:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
これにより、ファイルの順序が保持される場合とされない場合があります。
"*.csv"
に一致するファイルが現在のディレクトリにない場合、引用符で囲まれていないバージョンが動作することを期待*
しfind
ます。シェルはその後にリテラルを渡すからです。
コマンド
$ cat * > merged-file
実際には、「マージされたファイル」を連結に含めて、暴走したファイルを作成するという望ましくない副作用があります。これを回避するには、マージしたファイルを別のディレクトリに書き込みます。
$ cat * > ../merged-file
または、マージされたファイルを無視するパターンマッチを使用します。
$ cat *.txt > merged-file
cat * > merged-file
正常に動作します。グローブは、ファイルが作成される前に処理されます。merged-file
既に存在する場合、cat
(少なくとも私の場合)出力ファイルであることを検出し、それを読むことを拒否します。ファイルが既に存在し、パイプラインの後半にリダイレクトがある場合、明らかにそれを行うことはできません。
cat
ファイルが出力ファイルであるかどうかを検出する方法がありません。リダイレクトはシェルで行われます。cat
標準出力にのみ印刷します。
ここから他のものが言うように...あなたは使用することができます cat
あなたが持っているとしましょう:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
そして、あなたが唯一の希望file01
にfile03
とfileA
にfileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
または、ブレース展開を使用します。
cat ~/file0{1..3} ~/file{A..C} > merged-file
または、手の込んだブレース拡張を使用します。
cat ~/file{0{1..3},{A..C}} > merged-file
または、for
ループを使用できます:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
はグロビングパターンとして機能しないことに注意してください。
pattern
ファイルのを指定し、次のようにそれらすべてをマージできます。
cat *pattern* >> mergedfile
別のオプションが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
*
が「自然」な順序で展開するように番号が付けられている場合にのみ、ポスターが望んでいることを行うことに注意してください。「file1.txt ... file9.txt ... file14.txt」がある場合、file1?.txtはfile1.txtとfile2.txtの間でソートされるため、機能しません。名前を「file01.txt ... file09.txt ... file14.txt」に変更する必要があります。echo *
よくわからない場合は言ってください。