Win批处理-在每行上附加文本到TSV文件

3

我有一个目录中有多个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
        )
    )

这是相当丑陋的代码。

谢谢。 (更新 - 更新我的代码)


什么下划线?是原始TSV文件中出现的第一个下划线,还是文件名中的第一个下划线?如果您能给出一个例子,会更有帮助。 - dbenham
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
  )
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接