テキスト ファイルを含むフォルダーをループして、それらをマージしたいと考えています。
それらが合併するとき、重複を削除して並べ替えたいと思います。
バッチスクリプトでこれをどのように達成しますか?
テキスト ファイルを含むフォルダーをループして、それらをマージしたいと考えています。
それらが合併するとき、重複を削除して並べ替えたいと思います。
バッチスクリプトでこれをどのように達成しますか?
ターゲット ファイル名がワイルドカード仕様と一致しない限り、これを行う最も簡単な方法は次のとおりです。
copy /b file?.txt new_file.txt
「/b
バイナリ」モードでコピーすることを意味します。それ以外の場合、デフォルトは/a
でソースファイルのコピーを停止し、ファイルの最後にCtrl+Z
a を追加します。Ctrl+Z
以下のコメントが示すように、1 つまたは複数のファイルが CRLF で適切に終了しない可能性があるという懸念がある場合は、別の解決策があります。
(for %i in (file?.txt) do type %i)>new_file.txt
ファイル名にスペースやその他の奇妙な文字が含まれている場合は、次のように引用符で囲む必要がある場合があります。
(for %i in (*.txt) do type "%i")>new_file.txt
しかし、それは答えのほんの一部です。一意の名前を削除するには、バッチ ファイルのみを使用するソリューションや、powershell を使用するソリューションがいくつかありますが、最も簡単なのは GnuWin32 ソート ユーティリティを取得することです。SourceForgeから入手できます。次に、答えは簡単になります。
(for %i in (*.txt) do type "%i")|sort -u|>new_file.txt
これの副次的な利点は、GNU ソートが非常に便利なユーティリティであることです。
一部のファイルの最後の行が改行で終了していない場合、Lavinioのソリューションは正しく機能しません。
これは、最後の行が改行で終了していなくても、すべてのファイルを安全に連結する簡単なコマンド(バッチは不要)です。バッチファイル内から実行する場合は、パーセントを2倍にします。
>merged.tmp (for %F in (*.txt) do type "%F")
重複する行を並べ替えて削除する場合は、PAにPowerShellソリューションがあります。これは、重複する行を並べ替えて削除するバッチソリューションです。SORTはバッチで大文字と小文字を区別しないため、重複の削除でも大文字と小文字が区別されないことに注意してください。
@echo off
setlocal disableDelayedExpansion
>merged.tmp (for %%F in (*.txt) do type "%%F")
sort /rec 8192 merged.tmp /o merged.tmp2
>merged.txt (
for /f delims^=^ eol^= %%A in (merged.tmp2) do (
set "newLn=%%A"
setlocal enableDelayedExpansion
if /i "!newLn!" neq "!ln!" (
endlocal
set "ln=%%A"
echo %%A
) else endlocal
)
)
del merged.tmp merged.tmp2
ファイルを連結した後、「重複を削除して並べ替える」というOP要件を尊重するために、lavinioの回答を補完し、powershell sortおよびget-uniqueコマンドを使用します
gc allfiles.txt | sort | get-unique > allfiles.txt
これを cmd ファイルに追加します。
set cpy=
set filter=*.txt
set target=new_file.txt
del newfile.tmp
rem buildup concat
for %%a in (%filter%) do call :concat "%%a"
ren newfile.tmp %target%
rem REMOVE FILES! (carefull please!)
for %%a in (%filter%) do del /Q "%%a"
goto :done
:concat
if EXIST newfile.tmp ( copy newfile.tmp+%1 newfile.tmp ) else ( copy %1 newfile.tmp)
goto :EOF
:done
echo ready