2012-10-01 21 views
3

我有一個目錄的若干TSV文件文本TSV文件,我想將文件名稱附加上每行一個額外的列。 例如,我的數據如下所示。贏批次 - 附加在每一行

文件名: snapper_User_list.txt

Username group   
user1 admin 
user2 users 

文件名: marlin_User_list.txt

Username group 
root admin 
sql admin 

我的理想狀態會是有一個文本文件,看起來像下面。

文件名: output.txt的

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

現在我需要在MS Windows中完成此。

我有下面的腳本工作,但仍顯示在我的輸出完整的文件名。

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 
     ) 
    ) 

這是非常醜陋的代碼。

謝謝。 (更新 - 更新我的代碼)

+0

什麼底線?出現在原始TSV文件中的第一個下劃線或文件名中的第一個下劃線?如果你給出一個前後例子,這將有所幫助。 – dbenham

回答

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 
) 
)