テキストファイルをWindowsコマンドラインと連結し、先頭行を削除する


127

比較的大きなテキストファイルをいくつか連結する必要があるので、コマンドラインから連結することをお勧めします。残念ながら私はWindowsしか持っておらず、新しいソフトウェアをインストールできません。

type file1.txt file2.txt > out.txt

私はほとんど私が欲しいものを得ることができますが、file2.txtの最初の行をout.txtに含めたくありません。

開始行を指定するオプションがあることに気づきましたmoreが、+nこれらを組み合わせて目的の結果を得ることができませんでした。これはWindowsでは不可能かもしれないことは承知しており、out.txtをいつでも手動で編集して行を削除できますが、コマンドラインから簡単に実行できる方法はありますか?

回答:


136
more +2 file2.txt > temp
type temp file1.txt > out.txt

または使用できますcopy。詳細についてはcopy /?、を参照してください。

copy /b temp+file1.txt  out.txt

4
もちろん!ただし、一時ファイルの使用は避けた方がよいでしょう。括弧、パイプ、<を使用して1つのコマンドに入れようとしましたが、どこにも入れませんでした。copyコマンドは、はるかに高速ですが、それは最後にSUBの文字を置きます。これを回避する方法はありますか?
ジェームズ・

18
すべてのファイルを連結したい場合はcopy /b *.txt combined.txt、ファイルを個別にリストすることなく実行できます。
2015年

1
どうやらタブをスペースに変換します、残念です!
アントニオ

マージされたファイルから元のファイルを取得するコマンドはありますか?
swapnil gandhi

3
@ ghostdog74:type file1.txt temp > out.txt最初のファイルにヘッダーなしで2番目のファイルを実際に追加する必要があると思います
Marius

61

私はこれを使用し、それは私のためにうまくいきます:

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

もちろん、すべての実行前に、あなたはする必要があります DELETE C:\Folder\ConcatenatedFile.csv

唯一の問題は、すべてのファイルにヘッダーがある場合、すべてのファイルで繰り返されることです。


2
連結されたファイルのファイル名を入力すると、つまり、ファイルの末尾にあるアルファベット順でリストされます。ウィンドウが2回連結されているようです。問題が発生しないように、1filename.csvというファイル名を使用しました。別のフォルダへの統合も機能するはずだと思います...
SebK

1
>>の代わりに>を使用する場合は、事前にファイルを削除する必要はありません。>出力をリダイレクトし、毎回新しいファイルを作成します。>>出力をリダイレクトして追加します。
Eddie Deyo 2014

1
これは、OPが尋ねたfile2の最初の行をどのようにスキップするのですか?
Dan Dascalescu、2015

1
file2の最初の行はスキップされません。質問のその部分を逃しました。
Raj More

1
マージされたファイルから元のファイルを取得するコマンドはありますか?
swapnil gandhi

21

使用するための推奨事項についてコメントするのに十分な評判ポイントはありませんが*.csv >> ConcatenatedFile.csv、警告を追加できます。

ConcatenatedFile.csv連結に使用しているのと同じディレクトリにファイルを作成すると、それ自体に追加されます。


2
これは、OPが尋ねたfile2の最初の行をどのようにスキップするのですか?
Dan Dascalescu、2015

6

FORコマンドを使用してファイルを1行ずつエコーし、 'skip'オプションを使用して開始行の数を省略します...

FOR /F "skip=1" %i in (file2.txt) do @echo %i

次のようなものを含むバッチファイルの出力をリダイレクトできます...

FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

FOR変数がバッチファイル内で使用されている場合は、二重の%に注意してください。


4

これを行う方法は次のとおりです。

(type file1.txt && more +1 file2.txt) > out.txt

3

私の担当者が低すぎることを除いて、これをghostdog74へのコメントに入れます。

more +2 file2.txt > temp
このコードは実際にはファイルの1行目と2行目を無視します。OPは、最初のファイルのすべての行を保持し(ヘッダー行を維持するため)、2番目のファイルの最初の行(おそらく同じヘッダー行)を除外するため、OPで使用する必要があるヘッダー行のみを除外しますmore +1

type temp file1.txt > out.txt

このコードの結果の順序は不明です。されtempに付加file1.txt(所望に応じて)、またはされfile1.txtに付加temp(ヘッダ行は、結果ファイルの途中に埋設されるように望ましくありません)。

さらに、これらの操作には、大きなファイル(300MBなど)を使用すると非常に長い時間がかかります。


2

ソフトウェアをインストールできないとおっしゃっていましたが、その制限がどれほど厳しいかはわかりません。とにかく、私は同じ問題(おそらく同じヘッダーを持つ2つのファイルを連結しようとしている)を持っていて、このページにたどり着いた人には別の答えを提供したいと思った。

Windowsでたくさんのコマンドを試して、ひどくイライラし、大きなファイルを開くことができると約束していたが、できなかったあらゆる種類のグラフィカルエディターを試した後、ようやくLinuxルートに戻ってCygwinを開いた促す。2つのコマンド:

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

以下のためにfile1.csv800メガバイトとfile2.csv400メガバイト、これら2つのコマンドは私のマシン上で5秒の下にかかりました。Cygwinプロンプトでは、これも同じです。LinuxコマンドはCygwinでは遅いはずだと思っていましたが、そのアプローチははるかに少ない労力で、私が見つけることができるどのWindowsアプローチよりもはるかに簡単でした。


1

PowerShellで:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt

0

あなたは単にこれを試すこともできます

type file2.txt >> file1.txt

file1.txtの最後にfile2.txtの内容を追加します

元のfile1.txtが必要な場合は、事前にバックアップを取ってください。またはこれを行うことができます

type file1.txt > out.txt
type file2.txt >> out.txt

最初のファイルの最後で改行したい場合は、追加する前に次のコマンドを試すことができます。

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt

0

のヘルプでcopyは、ワイルドカードを使用して複数のファイルを1つに連結できることが説明されています。

たとえば、現在のフォルダにある「abc」で始まるすべての.txtファイルを、xyz.txtという名前の単一のファイルにコピーするには、次のように入力します。

copy abc*.txt xyz.txt

-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt

-1

これはTest.txt、ヘッダーを使用して追加Test1.txtTest2.txtTestresult.txt2番目と3番目のファイルからヘッダーをそれぞれ取り除いた後、結果をファイルに書き込みます。

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.