我有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或任何类似工具执行此操作,但我不知道如何。
谢谢
答案 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.该技术具有以下限制:
<carriage return><line feed>
此外,每个最终合并行不得超过~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