合并来自多个文件的行

时间:2012-07-12 10:06:33

标签: batch-file sed grep

我有3个像这样的文本文件

FILE1.TXT

AAA1
AAA2
AAA3
...
...

FILE2.TXT

BBB1
BBB2
BBB3
..
..

file3.txt

CCC1
CCC2
CCC3
..
..

我希望 output.txt 像这样

AAA1:BBB1:CCC1
AAA2:BBB2:CCC2
..
...

现在我可以通过循环读取每个文件中的一行来完成此操作,但我想使用sed,grep或任何类似工具执行此操作,但我不知道如何。

谢谢

3 个答案:

答案 0 :(得分:3)

使用paste

paste -d ':' file1.txt file2.txt file3.txt

答案 1 :(得分:1)

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

paste -d ":" file1.txt file2.txt file3.txt > output.txt

答案 2 :(得分:1)

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

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

但是,既然我喜欢用批量解决问题的挑战,我想我会尝试一下原生批量解决方案,只是为了好玩。

OP说"现在我可以通过从每个文件" 中读取一行来完成此操作。这说起来比使用批处理更容易!

通常使用FOR / F读取文件,但没有好的方法使用FOR / F交错来自多个文件的读取。唯一的其他原生替代方法是使用带有重定向输入的SET / P.该技术具有以下限制:

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

此外,每个最终合并行不得超过~8k字节的批量变量长度限制。

最后一个限制 - 该脚本最多只能处理7个输入文件。如果指定了超过7个文件,脚本将失败 - 我没有包含任何错误检查。

所以这是一个工作批处理脚本 - 调用它&#34; merge.bat&#34;。 注意 - 此批处理解决方案比使用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