PowerShell のフィルタ定義色々
PowerShell のフィルタで AWK コマンドと同等……同等以上の事ができる!
サンプル1
入力ファイルと出力ファイルを引数で受け取り、スクリプトファイル内で定義するフィルタで処理する。
sample1.ps1
Param( $in, $out ) # 各行を処理する Function Line-Process { # 1行目を処理する前 Begin { # 行番号を初期化(1 ベース) $nLineNo = 0 } # 1行目~最終行を処理する Main { # 行番号を更新 ++ $nLineNo # $_ は標準出力の各行を保持 $_ } # 最終行を処理した後 End { } } Get-Content $in | Line-Process | Out-File -LiteralPath $out
使用例
PS D:\tmp> sample1.ps1 input.txt output.txt
サンプル2
sample2.ps1
# 1行目を処理する前 Begin { # 行番号を初期化(1 ベース) $nLineNo = 0 } # 1行目~最終行を処理する Main { # 行番号を更新 ++ $nLineNo # $_ は標準出力の各行を保持 $_ } # 最終行を処理した後 End { }
使用例
PS D:\tmp> Get-Content input.txt | sample2.ps1 | Out-File -LiteralPath output.txt
サンプル3
サンプル1と2の場合、全体の行数がわからなかったり、各行を処理するときに他の行へアクセスできない。このサンプルではそれを解消する方法を示す。
sample3.ps1
# 標準入力を $stream へ代入 $stream = $($input) # 各行を処理する Function Line-Process { # 1行目を処理する前 Begin { # 行番号を初期化(1 ベース) $nLineNo = 0 } # 1行目~最終行を処理する Main { # 行番号を更新 # $i は $stream の参照用(0 ベース) $i = $nLineNo ++ # $i は標準出力の各行を保持 # $_ と $stream[$i] は同じ内容 "{0}`t{1}`t{2}" -f $nLineNo, $_, $stream[ $i ] } # 最終行を処理した後 End { } }
使用例
PS D:\tmp> Get-Content input.txt | sample3.ps1 | Out-File -LiteralPath output.txt