3

対象のテキスト ファイルの 4 つのサンプル行を次に示します。

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW       
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND

K=3$3 で見つかったが、\\

4行の目的の出力は次のとおりです。

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE, Directory, shellex, ContextMenuHandlers
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS, WINDOWS, system32, verclsid.exe
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW, Control Panel, International,
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND, Software, Microsoft, Windows

さらに調査した結果、次の 2 つのニュアンスがあります。

HK** で始まるパスもあれば、そうでないパスもあります。ただし、どちらの場合も、最初の の後に始まるパスのみを気にします\\\\この違いは、行 1 と行 2 の間でキャプチャされます。したがって、可能であれば、解析は単純に $3 ではなく固定する必要があると思います。(その用語を正しく使用していますか?)

第二に、パスの深さが異なります。列/フィールドの一貫性を保つために、これを維持するために、一部の情報を失い (4 行目)、短いパス用に空のフィールドを用意します (3 行目)。

4

2 に答える 2

1

を使用する 1 つの方法を次に示しGNU awkます。

awk 'BEGIN { FS=OFS="," } { split($3,a,"\\\\\\\\"); print $0, a[2], a[3], a[4] }' file

結果:

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE,Directory,shellex,ContextMenuHandlers
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS,WINDOWS,system32,verclsid.exe
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW,Control Panel,International,
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND,Software,Microsoft,Windows
于 2012-11-27T06:27:18.677 に答える
0

醜いPerlの場合:

perl -lane '{$l=$_;s/.*?\\\\([^,]*),.*/$1/;@v=split(/\\\\/,$_); print "$l,".join(",",@v[0,1,2]);}' input
于 2012-11-27T06:43:51.440 に答える