0

このような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 または同様のツールを使用してこれを行いたいのですが、方法がわかりません。

ありがとう

4

3 に答える 3

3

ペーストを使用:

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

貼り付けの答えは完璧な解決策のように聞こえます。

しかし、誰か (OP ではない) が、実行可能ファイルのダウンロードを必要としないネイティブ ソリューションを必要とする場合があります。このようなことは、VBScript や JScrpt などのより強力なスクリプト言語で行う必要があります。

しかし、私はバッチで物事を解決するという課題が好きなので、楽しみのために、ネイティブのバッチ ソリューションに挑戦してみようと思いました。

OPは、「各ファイルから行を読み取るループを作成することでこれを行うことができるようになりました」と述べました。バッチを使用すると、言うは易く行うは難しです!

通常、ファイルは FOR /F を使用して読み取られますが、FOR /F を使用して複数のファイルからの読み取りをインターリーブする適切な方法はありません。他の唯一のネイティブな代替手段は、リダイレクトされた入力で SET /P を使用することです。この手法には、次の制限があります。

  • 入力ファイルでは、Windows スタイルの行末記号を使用する必要があります。<carriage return><line feed>
  • 入力行の長さは 1021 バイトを超えることはできません (行末記号は無視します)。
  • 末尾の制御文字は各入力行から削除されます

さらに、最終的にマージされた各行は、バッチ変数の長さの制限である最大 8k バイトを超えてはなりません。

最後にもう 1 つ制限があります。スクリプトは最大 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 に答える
1

pasteは、このタスクに適しています。試す:

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