【问题标题】:Merge 2 txt files in a single tab delimited file in batch将 2 个 txt 文件批量合并到一个制表符分隔的文件中
【发布时间】:2011-08-11 19:28:26
【问题描述】:

我被这个困住了: 我需要在批处理脚本上将两个文本文件合并到一个制表符分隔的文本文件中。 例如:

文件1:

qwer
tyui
asdf

文件2:

1345
6876
8796

文件3:

qwer    1345
tyui    6876
asdf    8796

其实我只需要一个等价于 Unix 的命令:paste -d "\t" file1 file2 > file3

【问题讨论】:

  • @Adam:Unix 的粘贴命令会产生他在 file3 中显示的结果。
  • 没错,我需要在file3中显示结果

标签: windows bash batch-file


【解决方案1】:
 @echo off

 set f1=1.txt
 set f2=2.txt
 set "sep=  "  % tab %

 (
   for /f "delims=" %%a in (%f1%) do (
      setlocal enabledelayedexpansion
       set /p line=
       echo(%%a!sep!!line!
      endlocal
   )
 )<%f2%

pause
goto :eof

【讨论】:

  • 嘿伙计!它工作得很好!谢谢你是我的救命恩人。现在我只是想弄清楚它是如何工作的。这个 enabledelayedexpansion 本地变量是什么?以及如何!sep! !线!工作。
  • +5 :-),绝对令人印象深刻,我不知道set /p 可以从文件中读取 multiple 行,而且它似乎真的很强大无需延迟切换技术即可阅读所有内容。很久以前,我看到了一种全新的技术。
  • @user767990 天哪,这很有趣.. % tab % 是评论.. 没有输出标签.. 只是一个双空格。 setlocal enabledelayedexpansion ... endlocal 有点故事,但 setlocal 方面并不那么相关.. enabledelayedexpansion 方面实际上只是创建正常行为.. !sep!就像 %sep% 但它可以正常工作。您可能想知道为什么括号不匹配.. echo( 如果您愿意,可以用 echo/ 替换。
  • @user767990 聪明的一点是这种东西有效 C:\>( set /p line= & set /p line= )
  • @barlop: 不错,但是错了 :-) 查看@echo off setlocal DisableDelayedExpansion for %%a in ("Hello!") DO echo %%a setlocal EnableDelayedExpansion for %%a in ("Hello!") DO echo %%a 之间的区别,您可以阅读How the parser works
【解决方案2】:

walid2me 的答案太棒了,这只是一个小程序来展示如何使其对文件1.txt 中的!^ 等字符安全,文件2.txt 的内容是安全的,它被读取使用set/p 语法。

@echo off

 set f1=1.txt
 set f2=2.txt
 set "sep=  "  % tab %

 (
   setlocal DisableDelayedExpansion
   for /f "delims=" %%a in (%f1%) do (
      set "f1_line=%%a"
      setlocal EnableDelayedExpansion
       set /p f2_line=
       echo(!f1_line!!sep!!f2_line!
      endlocal
   )
   endlocal
 )<%f2%

pause
goto :eof

如您所见,我只将%%a 的扩展移动到setlocal EnableDelayedExpansion 之前

还有一个小缺陷,set/p 去除了尾随控制字符,例如单个 CR、LF 和 TAB。
这仅影响文件 2.txt。

关于set /p的深入分析在New technic: set /p can read multiple lines from a file

【讨论】:

  • 假设是cmd /v:on,可以把setlocal DisableDelayedExpansion放在for /f前面,endlocal放在set "f1_line=%%a"后面吗?
  • 不,那么每个循环都有一个 endlocal,但没有更多的 setlocal,您将使用 endlocal 破坏 f1_line 变量。即使启用了 DelayedExpansion,我也会编辑答案以确保安全
【解决方案3】:

据我所知,没有本地 Windows 命令可以做到这一点,但有一组适用于 Windows 的 Unix 工具here

【讨论】:

  • 批量编写脚本让我寻找 :) 你说得对,找不到内置工具来完成这项工作。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多