すべて1つのテキストの一部である14個のファイルがあります。それらを1つにマージしたいと思います。どうやってするか?
これは技術的にはcat
( "concatenate")が行うことになっていますが、ほとんどの人はstdoutにファイルを出力するためだけに使用します。複数のファイル名を指定すると、それらはすべて順番に出力され、それを新しいファイルにリダイレクトできます。すべてのファイルの場合、*
(または/path/to/directory/*
(まだディレクトリにいない場合)、シェルはそれをすべてのファイル名に展開します
$ cat * > merged-file
ファイルが同じディレクトリにない場合は、連結の前に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
これにより、ファイルの順序が保持される場合とされない場合があります。
コマンド
$ cat * > merged-file
実際には、「マージされたファイル」を連結に含めて、暴走ファイルを作成するという望ましくない副作用があります。これを回避するには、マージしたファイルを別のディレクトリに書き込みます。
$ cat * > ../merged-file
または、マージされたファイルを無視するパターンマッチを使用します。
$ cat *.txt > merged-file
ここにある他のものと同じように... 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
ファイルの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
最後の行は(wmerge.txtではなく)merge.txtも書き込むことに注意してください。 w "merge.txt"を使用してファイル名との混乱を回避し、-nを使用してサイレント出力を行うことができます。
もちろん、ワイルドカードを使用してファイルリストを短くすることもできます。たとえば、上記の例のように番号付きファイルの場合、次のように中括弧で範囲を指定できます。
sed -n w"merge.txt" {1..3}.txt