前提・実現したいこと
Windows Server 2012R2 6.3.9600
PSVersion 5.1.14409.1018
テキストファイル(out.csv)
text
1"name","group" 2"yuko_sato","site_tokyo" 3"hitomi_suzuki","site_osaka" 4"kazuki_takahashi","site_osaka" 5"eiji_tanaka","site_nagoya"
があり、これを powershell で読み込み、整形したい。
powershell
1PS> Import-Csv -Path .\out.csv 2 3name group 4---- ----- 5yuko_sato site_tokyo 6hitomi_suzuki site_osaka 7kazuki_takahashi site_osaka 8eiji_tanaka site_nagoya
この出力を、name カラムでは「????」部を置換、group カラムでは「site」を置換したい。
(以下の例では単なる削除になっているが、実際にはもっと複雑な正規表現による置換を行いたいので、-replace を使用している)
powershell
1PS> Import-Csv -Path .\out.csv | ForEach-Object { $_.name -replace '[a-z]+_(.+)','$1' } 2sato 3suzuki 4takahashi 5tanaka 6 7PS> Import-Csv -Path .\out.csv | ForEach-Object { $_.group -replace 'site_(.+)','$1' } 8tokyo 9osaka 10osaka 11nagoya
問題
上記のように列ごとの出力はできるのだが、複数列の置換後の「テーブル」を取得するにはどうすればよいでしょうか?できればワンライナー。
以下は求めている出力。
text
1name group 2---- ----- 3sato tokyo 4suzuki osaka 5takahashi osaka 6tanaka nagoya
python(pandas)なら
python
1>>> import pandas as pd 2>>> df = pd.read_csv("out.csv") 3>>> df 4 name group 50 yuko_sato site_tokyo 61 hitomi_suzuki site_osaka 72 kazuki_takahashi site_osaka 83 eiji_tanaka site_nagoya 9 10>>> df['name'] = df['name'].str.replace('[a-z]+_(.*)', r'\1', regex=True) 11>>> df['group'] = df['group'].str.replace('site_(.*)', r'\1', regex=True) 12 13>>> df 14 name group 150 sato tokyo 161 suzuki osaka 172 takahashi osaka 183 tanaka nagoya
のようなことを、powershell(あわよくばワンライナー)で行いたい。
そもそも ForEach-Object で複数列を扱うこと自体に問題があるのかもしれませんので代替方法でも構いません。
実際にやりたいことは、powershell の出力(「Get-WmiObject Win32_GroupUser」)から直にこのようなことを行いたいため。
見たような口調だな。
回答1件
あなたの回答
tips
プレビュー