web-dev-qa-db-ja.com

ディレクトリ内のすべての(テキスト)ファイルを1つにマージする方法は?

すべて1つのテキストの一部である14個のファイルがあります。それらを1つにマージしたいと思います。どうやってするか?

99
Ivan

これは技術的にはcat( "concatenate")が行うことになっていますが、ほとんどの人はstdoutにファイルを出力するためだけに使用します。複数のファイル名を指定すると、それらはすべて順番に出力され、それを新しいファイルにリダイレクトできます。すべてのファイルの場合、*(または/path/to/directory/*(まだディレクトリにいない場合)、シェルはそれをすべてのファイル名に展開します

$ cat * > merged-file
182
Michael Mrozek

ファイルが同じディレクトリにない場合は、連結の前に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

これにより、ファイルの順序が保持される場合とされない場合があります。

27
3nrique0

コマンド

$ cat * > merged-file

実際には、「マージされたファイル」を連結に含めて、暴走ファイルを作成するという望ましくない副作用があります。これを回避するには、マージしたファイルを別のディレクトリに書き込みます。

$ cat * > ../merged-file

または、マージされたファイルを無視するパターンマッチを使用します。

$ cat *.txt > merged-file
10

ここにある他のものと同じように... catを使用できます

あなたが持っているとしましょう:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

また、file01からfile03まで、fileAfileCだけにしたい場合:

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
10
Florin Idita

ファイルのpatternを指定して、次のようにすべてをマージできます。

cat *pattern* >> mergedfile
0
user182845

別のオプションは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
0
Harini