我在目录中有许多TSV文件,我想在每一行上附加文件名作为额外的列。 例如,我的数据如下所示。
BEFORE
FileName: snapper_User_list.txt
Username group
user1 admin
user2 users
FileName: marlin_User_list.txt
Username group
root admin
sql admin
我的理想状态是有一个文本文件,如下所示。
AFTER
FileName: 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 :(得分: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
)
)