2

次の内容の 2 つのテキスト ファイルがあります。

ファイル1.txt:

ProcessId  VirtualSize  
5752       74649600     
3932       76843610
1357       90215638
& so on....

file2.txt:

Notepad.exe pid: 3932 Linux
Notepad.exe pid: 1357 Macos
Notepad.exe pid: 5752 Windows
& so on....

これで、両方のファイルでプロセス ID が同じ (一致) であることがわかるので、統合された単一の出力ファイル (両方のファイルで processId が一致) を生成したいと考えています。

出力.txt:

Windows 74649600  
Linux  76843610
Macos  90215638 
& so on....

以下で試してみましたが、実行中ですが、必要な出力が得られません:

@echo off
(for /f "skip=1 tokens=1,2" %%a in (file1.txt) do (
for /f "tokens=5" %%c in ('find " %%a " ^< file2.txt ') do echo %%c %%b
))>Output.txt 

EDIT1 : 「Output.txt」の最初の2行を文字列で永遠に修正/設定したい場合は、何を追加すればよいですか:

This output is for first server
Applcation Memory(GB )

すなわち:

出力.txt:

This output is for first server
Applcation Memory(GB)
Windows  74649600  
Linux  76843610
Macos  90215638 
& so on....
4

2 に答える 2

2

2 番目の FOR は次のようになります。「tokens=5」の部分は 5 番目のトークンを選択し、それ以外は何も選択しません。トークン 3 と 5 が必要です。

(for /f "skip=1 tokens=1,2" %%a in (file1.txt) do (
    for /f "tokens=3,5" %%x in ('find " %%a " ^< file2.txt ') do echo %%b %%y
))

File1 と File2 が長い場合、そのスクリプトは機能しますが、非常に遅くなります。file1 と file2 を再フォーマットして、各行の最初に PID を配置するスクリプトを作成しました。次に、SORT を使用してファイルを PID で整理します。最後に、並べ替えられた出力をスキャンして、一致する PID を持つ行のペアを探します。

少し長いですが、仕組みを理解するのはかなり簡単です。

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set INPUT1=file1.txt
set INPUT2=file2.txt
set OUTFILE=Outfile.txt
set TMPFILE=OutfileTMP.txt
set OUT=^>^>%OUTFILE%

if exist %OUTFILE% del %OUTFILE%
if exist %TMPFILE% del %TMPFILE%

call :ReadFile1
call :ReadFile2

sort < %OUTFILE% > %TMPFILE%
del %OUTFILE%
echo This output is for HFM server%OUT%
echo Applcation Memory(GB )%OUT%

set LASTPID=-
set LASTSIZE=-

for /f "tokens=1,2,3" %%a in (%TMPFILE%) do (
    if "%%b"=="1" set LASTPID=%%a&set LASTSIZE=%%c
    if "%%b"=="2" (
        if "%%a"=="!LASTPID!" (
            echo %%c !LASTSIZE! %OUT%
        ) else (
            echo Error: Not Matched: 1:!LASTPID!,!LASTSIZE!, 2:%%a %%c
        )
    )
)

del %TMPFILE%

goto :EOF


:ReadFile1
    for /f "skip=1 tokens=1,2" %%a in (%INPUT1%) do echo %%a 1 %%b %OUT%
    goto :EOF

:ReadFile2
    for /f "tokens=3,5" %%a in (%INPUT2%) do echo %%a 2 %%b %OUT%
    goto :EOF
于 2013-10-16T03:54:05.383 に答える
1

どうですか:

@echo off

echo This output is for HFM server > out.txt
echo Applcation Memory(GB) >>out.txt

for /f "skip=1 tokens=1,2" %%a in (file1.txt) do (
   for /f "skip=2 tokens=5" %%c in ('find " %%a " file2.txt 2^>nul') do ( 
     echo %%c %%b >>out.txt
  )
) 

?

于 2013-10-16T04:36:43.923 に答える