我有 3 个这样的文本文件
文件1.txt
AAA1
AAA2
AAA3
...
...
文件2.txt
BBB1
BBB2
BBB3
..
..
文件 3.txt
CCC1
CCC2
CCC3
..
..
我想要这样的output.txt
AAA1:BBB1:CCC1
AAA2:BBB2:CCC2
..
...
现在我可以通过循环从每个文件中读取一行来做到这一点,但我想使用 sed 、 grep 或任何类似工具来做到这一点,但我不知道怎么做。
谢谢
我有 3 个这样的文本文件
文件1.txt
AAA1
AAA2
AAA3
...
...
文件2.txt
BBB1
BBB2
BBB3
..
..
文件 3.txt
CCC1
CCC2
CCC3
..
..
我想要这样的output.txt
AAA1:BBB1:CCC1
AAA2:BBB2:CCC2
..
...
现在我可以通过循环从每个文件中读取一行来做到这一点,但我想使用 sed 、 grep 或任何类似工具来做到这一点,但我不知道怎么做。
谢谢
使用粘贴:
paste -d ':' file1.txt file2.txt file3.txt
paste
非常适合这项任务。尝试:
paste -d ":" file1.txt file2.txt file3.txt > output.txt
粘贴答案听起来像是一个完美的解决方案。
但是有人(不是 OP)可能想要一个不需要下载可执行文件的本机解决方案。像这样的事情真的应该用更强大的脚本语言来完成,比如 VBScript 或 JScrpt。
但是,由于我喜欢用批处理解决问题的挑战,我想我会尝试使用原生批处理解决方案,只是为了好玩。
OP 说“现在我可以通过循环从每个文件中读取一行来做到这一点”。使用批处理说起来容易做起来难!
通常使用 FOR /F 读取文件,但没有好的方法可以使用 FOR /F 交叉读取多个文件。唯一的其他本机替代方法是将 SET /P 与重定向输入一起使用。这种技术有以下限制:
<carriage return><line feed>
此外,每个最终合并的行不得超过 ~8k 字节的批处理可变长度限制。
最后一个限制 - 脚本最多只能处理 7 个输入文件。如果指定超过 7 个文件,脚本将失败 - 我没有包含任何错误检查。
所以这是一个工作批处理脚本 - 称之为“merge.bat”。注意 - 此批处理解决方案比其他解决方案慢得多,例如粘贴或用 VBScript 或 JScript 编写的脚本。但它确实有效:-)
@echo off
setlocal disableDelayedExpansion
::Initialization
set "inputRedirection="
set "files=2"
set "lines=0"
for %%F in (%*) do call :setInputRedirection
setlocal enableDelayedExpansion
set "inputRedirection=!inputRedirection:::=<!"
::Merge the files
%inputRedirection% (
for /l %%N in (1 1 %lines%) do (
set "ln="
for /l %%I in (3 1 %files%) do (
call :readLine %%I
if %%I neq %files% (
set "ln=!ln!!input!:"
) else (
echo(!ln!!input!
)
)
)
)
exit /b
:setInputRedirection
set /a "files+=1"
for %%A in (1) do (
set inputRedirection=%files%::"%%~F" %inputRedirection%
for /f %%N in ('find /c /v "" ^<"%%~F"') do if %%N gtr %lines% set "lines=%%N"
)
exit /b
:readLine fileHandle
set "input="
<&%1 set /p "input="
exit /b
要合并您的文件,您将执行以下操作:
merge.bat file1.txt file2.txt file3.txt >output.txt