さて、PowerShellではどうでしょうか。
前回までLinuxで使っていた実験ファイルをWindowsでも使います。
使うファイルは以下の通り。
PS C:\Users\takk\tmp> ls -name list x00 x01 x02 x03 x04 x05 x06 x07 x08 x09 PS C:\Users\takk\tmp>
listの内容はこの通り。
PS C:\Users\takk\tmp> cat list x00:40 x00:72 x00:87 x01:25 x01:32 x01:36 x02:27 x02:60 x02:92 x04:17 x05:11 x05:16 x05:23 x05:60 x05:87 x06:52 x07:14 x09:16 x09:57 x09:87 PS C:\Users\takk\tmp>
lsとかcatとか、Linuxみたいですが、PowerShellのエイリアスです(cat=gc=Get-Content、ls=dir=Get-ChildItem)。
以降catは紛らわしいのでgc使います。
sedは使えない前提ということで、PowerShellで指定行を抽出するためには、gcで一行ずつ読み込むことになります。
PS C:\Users\takk\tmp> gc x00 taffeta's Btu's pedagog designations Charybdis's preheating waggling hitter's growl Pb's ~省略~
指定の行のみを抽出するため、変数を使っていきます。
変数$nを用意し、0で初期化し、行数をカウントします。
カウント値が所望の行番号になったら、表示($_と書くだけ)をすれば、指定行を抽出することができます。
PS C:\Users\takk\tmp> gc x00 | % {$n=0}{$n++;if($n -eq 2){$_}} Btu's PS C:\Users\takk\tmp>
2行目が抽出できました。
次に、listは:(コロン)で区切られたファイル名と行番号の情報なので、
-splitでそれぞれを取得します。
PS C:\Users\takk\tmp> gc list | % {$a,$b=$_ -split ":"; "FILE=$a LINENO=$b"} FILE=x00 LINENO=40 FILE=x00 LINENO=72 FILE=x00 LINENO=87 FILE=x01 LINENO=25 FILE=x01 LINENO=32 FILE=x01 LINENO=36 FILE=x02 LINENO=27 FILE=x02 LINENO=60 FILE=x02 LINENO=92 FILE=x04 LINENO=17 FILE=x05 LINENO=11 FILE=x05 LINENO=16 FILE=x05 LINENO=23 FILE=x05 LINENO=60 FILE=x05 LINENO=87 FILE=x06 LINENO=52 FILE=x07 LINENO=14 FILE=x09 LINENO=16 FILE=x09 LINENO=57 FILE=x09 LINENO=87 PS C:\Users\takk\tmp>
これだけできれば、後は、ファイル名と行番号を指定して、該当行のカウント値になった時に、表示するだけです。
PS C:\Users\takk\tmp> gc list | % { ($a,$b) = $_ -split ":";gc $a | %{$n=0}{$n++;if($n -eq $b){"$n $_"}} } 40 parrakeet 72 barraged 87 parrakeets 25 irritatingly 32 deterring 36 borrowed 27 irresistible 60 surrounds 92 harried 17 Barr's 11 guerrilla's 16 Lorraine's 23 irregularity's 60 surrealism's 87 Corrine 52 diarrhoea's 14 scarred 16 stirrer's 57 barren 87 Barrie's PS C:\Users\takk\tmp>
コメント