PowerShell(join代替)


アニメ『最遊記RELOAD BLAST』
気の合う仲間っていいですね。みんな強いし。 第3シーズンとは知らず見てしまいました。途中からも楽しめる話になってるんですね。
第1シーズンから見ようと思いました。

仲間ということで、joinです。仲間に加わる意味ですが、Unix/Linuxのjoinコマンドは指定列の同一項目を結合してくれるコマンドです。
これを、PowerShellでもやってみたいと思います。
まずjoinする元のファイルを適当に作ります。

PS C:\Users\takk\aaa> 1..10 | %{ "{0:d1}`t{1:d1}" -f $_ , $(random)} > file1
PS C:\Users\takk\aaa> 3,4,5 | %{ "{0:d1}`t{1:d1}" -f $_ , $(random)} > file2

それぞれの内容です。

PS C:\Users\takk\aaa> cat file1
1       497585595
2       1980261099
3       182124860
4       1085555943
5       1382725001
6       381820766
7       500921000
8       361022721
9       131614824
10      1843791556
PS C:\Users\takk\aaa> cat file2
3       1421951741
4       1254637545
5       1604066056
PS C:\Users\takk\aaa>

1列目の情報でjoinしてみましょう。連想配列を使います。

PS C:\Users\takk\aaa> cat file2 | %{$hash=@{}}{$a,$b=$_.split("`t");$hash.add($a,$b)}{ cat file1 | %{$a,$b=$_.split("`t");"$_`t"+$hash["$a"]}}
1       497585595
2       1980261099
3       182124860       1421951741
4       1085555943      1254637545
5       1382725001      1604066056
6       381820766
7       500921000
8       361022721
9       131614824
10      1843791556
PS C:\Users\takk\aaa>

このままだと使いにくいので、関数にします。

PS C:\Users\takk\aaa> function join($file1,$file2){
>> cat $file2 | %{$hash=@{}}{$a,$b=$_.split("`t");$hash.add($a,$b)}{
>> cat $file1 | %{$a,$b=$_.split("`t");"$_`t"+$hash["$a"]}}
>> }
>>
PS C:\Users\takk\aaa>

名前をjoinにしました。

join ファイル名 ファイル名
で実行すると、1列目の文字列が一致する行を結合します。

PS C:\Users\takk\aaa> join file1 file2
1       497585595
2       1980261099
3       182124860       1421951741
4       1085555943      1254637545
5       1382725001      1604066056
6       381820766
7       500921000
8       361022721
9       131614824
10      1843791556
PS C:\Users\takk\aaa> join file2 file1
3       1421951741      182124860
4       1254637545      1085555943
5       1604066056      1382725001
PS C:\Users\takk\aaa>

別のファイルを作って試してみましょう。

PS C:\Users\takk\aaa> 3,5,7 | %{ "$_`tBBBB`tCCCC"} > file3
PS C:\Users\takk\aaa> join file1 file3
1       497585595
2       1980261099
3       182124860       BBBB CCCC
4       1085555943
5       1382725001      BBBB CCCC
6       381820766
7       500921000       BBBB CCCC
8       361022721
9       131614824
10      1843791556
PS C:\Users\takk\aaa> join file1 file3

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA