3

ディレクトリに多数のTSVファイルがあり、すべての行に追加の列としてファイル名を追加したいと思います。たとえば、私のデータは次のようになります。

ファイル名: snapper_User_list.txt

Username    group        
user1 admin  
user2 users

ファイル名: marlin_User_list.txt

Username    group  
root admin  
sql admin

私の理想的な状態は、次のような1つのテキストファイルがあることです。

ファイル名: output.txt

user1 admin snapper  
user 2 users snapper  
root admin marlin  
sql admin marlin  

今のところ、MSWindowsでこれを完了する必要があります。

以下のスクリプトは機能していますが、出力にはファイル名全体が表示されます。

Rem Rename the files by just using the name before the underscore.
for /f "tokens=1* delims=_" %%i in ( 'dir *.txt /b' ) do (
    rename %%i_%%j %%i.txt
    )

Rem Combine the files.
FOR %%I IN (*.txt) DO (
    FOR /f "tokens=*" %%a IN (%%I) DO (
        echo %%a%TAB%%%I>>combined.txt
        )
    )

それはかなり醜いコードです。

ありがとう。(更新-私のコードを更新)

4

1 に答える 1

2

ファイル名に含まれるアンダースコアを参照していると仮定します。

@echo off
setlocal

::The following defines a TAB character that is not preserved on StackOverflow
set "TAB=   "

for %%F in (*.txt) do call :processFile "%%F"
exit /b

:processFile
set "name=%~1"
set name=%name:_=&rem %
for /f "usebackq delims=" %%a in (%1) do echo %%a%TAB%%name%>>combined.txt

魔法のコマンドはset name=%name:_=&rem %です。これは、REMarkコマンドをステートメントに挿入することによって機能します。現在の名前が。であると仮定しpart1_part2.txtます。検索と置換の展開後、ステートメント全体は次のようになります。set name=part1&rem part2.txt

編集-改善された答え

編集した質問を見ると、もっと良い方法があることがわかります。FOR / Fを使用して名前を解析することを考えるべきでした:-)あなたは90%そこにいました!

@echo off
setlocal

::The following defines a TAB character that is not preserved on StackOverflow
set "TAB=   "

for %%F in (*.txt) do (
  for /f "delims=_" %%I in ("%%F") do (
    for /f "usebackq delims=" %%a in ("%%F") do echo %%a%TAB%%%I>>combined.txt
  )
)
于 2012-10-01T11:21:25.287 に答える