我正在尝试编写一个.bat文件,它获取3个参数--2个输入文件和一个输出文件的名称 - 并写入一个新的文件,其中input1和input2的行交替。
这可能听起来很奇怪,但我会试着举个例子:
1.txt的内容:
line 1
line 3
line 5
2.txt的内容:
line 2
line 4
line 6
以
运行时> myscript.bat 1.txt 2.txt 3.txt
脚本应使用内容
创建文件3.txt
line 1
line 2
line 3
line 4
line 5
line 6
for-loop
token=*
仅适用于单个文件,而不适用于两个文件。我怎样才能实现交替线路?
问候,乔
答案 0 :(得分:1)
如果你的任何一行都有感叹号,这段代码会有问题,没有一行可以超过8192个字符,如果第二个文件比第一个文件短,它只会使用尽可能多的行第一个文件在第二个文件中(如果file1.txt有5行,file2.txt有三行,脚本只从file1.txt获取前3行,输出总共有6行),但是代码工作原理:
@echo off
setlocal enabledelayedexpansion
set file1=%~1
set file2=%~2
set target_file="%~3"
:: Read in the entire first file and store it in an arraylike
set counter=-1
for /f "delims=" %%A in (%file1%) do (
set /a counter=!counter!+1
set file_1[!counter!]=%%A
)
:: Read in the entire second file and store it in an arraylike
set counter=-1
for /f "delims=" %%A in (%file2%) do (
set /a counter=!counter!+1
set file_2[!counter!]=%%A
)
:: Read one line at a time, alternating lines
type nul>%target_file%
for /L %%A in (0,1,!counter!) do (
echo !file_1[%%A]!>>%target_file%
echo !file_2[%%A]!>>%target_file%
)
答案 1 :(得分:0)
这是纯粹的原生批处理解决方案。
@echo off
setlocal disableDelayedExpansion
<test2.txt >out.txt (
for /f "delims=" %%A in ('findstr /n "^" "test1.txt"') do (
set "ln=%%A"
setlocal enableDelayedExpansion
echo(!ln:*:=!
set "ln="
set /p "ln="
echo(!ln!
endlocal
)
)
使用我的JREPL.BAT utility有一个更简单,更快速,更强大的解决方案,没有任何限制 - 一个混合的JScript /批处理脚本,可以在XP以后的任何Windows机器上运行。
JREPL.BAT旨在对文件内容进行正则表达式搜索和替换,这不是您需要的。但是,它能够从stdin和文件中读取,因此它是一种方便的方法来合并两个文件的内容而无需编写太多代码。
以下假设文件1至少与文件2一样多。
type test1.txt|jrepl "^" "" /jendln "stdout.WriteLine(stdin.ReadLine())" /f test2.txt /o out.txt
如果一个文件的行数多于另一个文件,则您尚未说明要执行的操作。如果发生这种情况,可以修改上述任何一种解决方案以满足您的需求。