web-dev-qa-db-ja.com

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

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

type file1.txt file2.txt > out.txt

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

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

123
James
more +2 file2.txt > temp
type temp file1.txt > out.txt

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

copy /b temp+file1.txt  out.txt
134
ghostdog74

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

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

もちろん、毎回実行する前に、DELETE C:\Folder\ConcatenatedFile.csvする必要があります

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

61
Raj More

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

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

21
John Faughnan

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変数がバッチファイル内で使用されている場合、二重%に注意してください。

6
Alberto Rossini

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

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

type temp file1.txt > out.txt

このコードからどのような順序が生じるかは不明です。 tempfile1.txtに追加されている(必要に応じて)か、file1.txttempに追加されている(ヘッダー行が結果ファイルの中央に埋め込まれるため、望ましくない)。

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

3
Brian D

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

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

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

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

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

file1.csv 800MBおよびfile2.csv 400MBの場合、これらの2つのコマンドは私のマシンで5秒未満かかりました。 Cygwinプロンプトでは、それ以下です。 CygwinではLinuxコマンドが遅いはずだと思っていましたが、そのアプローチははるかに少ない労力で、私が見つけたどのウィンドウアプローチよりもずっと簡単でした。

2
Andrew Mao

PowerShellで:

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

これも簡単に試すことができます

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
Hamed

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

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

copy abc*.txt xyz.txt
0
GaTechThomas