0

テキスト ファイルを含むフォルダーをループして、それらをマージしたいと考えています。

それらが合併するとき、重複を削除して並べ替えたいと思います。

バッチスクリプトでこれをどのように達成しますか?

4

4 に答える 4

2

ターゲット ファイル名がワイルドカード仕様と一致しない限り、これを行う最も簡単な方法は次のとおりです。

copy /b file?.txt new_file.txt

/bバイナリ」モードでコピーすることを意味します。それ以外の場合、デフォルトは/aでソースファイルのコピーを停止し、ファイルの最後にCtrl+Za を追加します。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 ソートが非常に便利なユーティリティであることです。

于 2012-10-28T19:21:27.273 に答える
1

一部のファイルの最後の行が改行で終了していない場合、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
于 2012-10-28T21:46:53.937 に答える
1

ファイルを連結した後、「重複を削除して並べ替える」というOP要件を尊重するために、lavinioの回答を補完し、powershell sortおよびget-uniqueコマンドを使用します

gc allfiles.txt | sort | get-unique > allfiles.txt 
于 2012-10-28T20:16:05.443 に答える
0

これを 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
于 2012-10-28T19:14:49.270 に答える