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
 スクリプトファイル自体でフィルタを定義し、入力ファイルと出力ファイルはスクリプトファイル外で処理する。(sample1.ps1 から Line-Process の中身を取り出したもの)
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