2012-07-12 2 views
0

나는이병합 라인

은 File2.txt

AAA1 
AAA2 
AAA3 
... 
... 

file2.txt

BBB1 
BBB2 
BBB3 
.. 
.. 

file3.txt

추천 텍스트 파일이
CCC1 
CCC2 
CCC3 
.. 
.. 

나는 지금은 각 파일에서 라인을 읽는 루프를 제작하여이 작업을 수행 할 수 있습니다이

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

처럼 OUTPUT.TXT 을 갖고 싶어하지만 난이 사용 나오지도, 그렙 또는 유사한 작업을 수행 할 도구를 사용하지만 방법을 모른다.

감사

답변

3

사용 paste :

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

할 수 있습니다 얻을 [유닉스 유틸리티 (http://unxutils.sourceforge.net/) Windows 용 . –

+0

고마워, 정확히 내가 원하는 걸 했어. – Leo92

1

paste이 작업에 적합하다. 시도해보십시오.

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

완벽한 답변처럼 들립니다.

그러나 누군가 (OP가 아닌) 실행 파일을 다운로드 할 필요가없는 기본 솔루션이 필요할 수 있습니다. 이와 같은 것은 실제로 VBScript 나 JScrpt와 같은보다 강력한 스크립팅 언어로 수행되어야합니다.

하지만 일괄 처리로 해결할 수있는 도전 과제를 좋아하기 때문에 기본 배치 솔루션을 사용하여 재미로 생각했습니다.

OP는 을 "이제는 각 파일의 한 줄을 읽는 루프를 만들면됩니다.". 일괄 처리를 사용하는 것보다 쉽습니다.

일반적으로 FOR/F를 사용하여 파일을 읽지 만 FOR/F를 사용하여 여러 파일에서 읽기를 인터리브하는 좋은 방법은 없습니다. 유일한 다른 기본 대안은 리디렉션 된 입력과 함께 SET/P를 사용하는 것입니다. 제거됩니다 <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 
    
  • +0

    좋은 대답, 솔직히 말해서 나는 그 생각이 복잡해질 것이라고 생각하지 않았지만 너는 옳았다. 그러나 나는 긴 코드가 될 것이라는 것을 알았고 그게 내가 한 이유였다. 붙여 넣기 사용을 선택했지만 코드가 매우 유용합니다. 지금은 새로운 방법을 배웠기 때문에 감사합니다. 감사합니다. – Leo92