ファイルパスと行番号から該当行抽出(PowerShell)

さて、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>

コメント

タイトルとURLをコピーしました