0

我有 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 或任何类似工具来做到这一点,但我不知道怎么做。

谢谢

4

3 回答 3

3

使用粘贴

paste -d ':' file1.txt file2.txt file3.txt
于 2012-07-12T10:38:51.240 回答
1

paste非常适合这项任务。尝试:

paste -d ":" file1.txt file2.txt file3.txt > output.txt
于 2012-07-12T10:41:53.277 回答
1

粘贴答案听起来像是一个完美的解决方案。

但是有人(不是 OP)可能想要一个不需要下载可执行文件的本机解决方案。像这样的事情真的应该用更强大的脚本语言来完成,比如 VBScript 或 JScrpt。

但是,由于我喜欢用批处理解决问题的挑战,我想我会尝试使用原生批处理解决方案,只是为了好玩。

OP 说“现在我可以通过循环从每个文件中读取一行来做到这一点”。使用批处理说起来容易做起来难!

通常使用 FOR /F 读取文件,但没有好的方法可以使用 FOR /F 交叉读取多个文件。唯一的其他本机替代方法是将 SET /P 与重定向输入一起使用。这种技术有以下限制:

  • 输入文件必须使用 Windows 样式的行终止符:<carriage return><line feed>
  • 输入行的长度不能超过 1021 字节(不考虑行终止符)
  • 从每个输入行中去除尾随控制字符

此外,每个最终合并的行不得超过 ~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
于 2012-07-13T02:53:32.023 回答