1. bunzaemon

    No comment

    bunzaemon
Changes in body
Source | HTML | Preview
@@ -1,138 +1,140 @@
+20160701
+
または、`PowerShell` で `(sort |) uniq -c`
多分もっといい計算方法があるはず。
## やりたいこと
|名前|教科|点数|コメント|
|:--|:--|:--|:--|
|A|国語|100|-|
|B|国語|90|-|
|C|国語|90|-|
|A|理科|50|-|
|B|理科|70|-|
|C|理科|70|-|
`csv` でこんなのが山ほどあるとして、各教科で各点数が何名いるか集計したい場合。
つまり、`perl` でなら
```
$ perl -MTest::More -F, -lane '$a->{$F[1]}->{$F[2]} ++ }{ note explain $a' test.csv
# {
# '国語' => {
# '100' => 1,
# '90' => 2
# },
# '理科' => {
# '50' => 1,
# '70' => 2
# }
# }
```
なんてお茶を濁す作業。
## `PowerShell` にて
Dos窓で、
```
> powershell
PS > cd bar
```
`PowerShell` を起動して、目的のファイルがあるところまで `cd`
### ワンライナー
日本語交じりなら、Shift-jis で。
**A**
```
PS > cat test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } | group $_ | select name, count
Name Count
---- -----
国語,100 1
国語,90 2
理科,50 1
理科,70 2
```
**B**
```
PS > cat test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } | group -NoElement
Count Name
----- ----
1 国語,100
2 国語,90
1 理科,50
2 理科,70
```
- `sort` を付けたければ、各ワンライナーのあとに工夫して。
- A, B に違いが無いように見えるが、 B は、"Name" 文字列が長くなると後半が切れてしまって悲惨なことになる。
#### 試行錯誤中だった時のスクリプト
まあ、配列の作り方やらを備忘しとくのに。
```
$list= (Get-Content test.csv | %{ $a = $_.split(",") ; $a[1], $a[2] -join "," } )
foreach ( $item in ( $list | sort -Unique ) ){
$d = ( $list | Select-String -SimpleMatch $item | Measure-Object ).Count
Write-Output ( $item, $d -join "," )
}
```
## ごくごく初歩のメモ
どうせ、しばらく使わないので、メモっとく
### PowerShell の設定
ドス窓ひらいて、
```
> powershell
```
て打って、文句言われたら、`Set-ExecutionPolicy -Scope CurrentUser` あたりを打ち込む
### Powershell のコマンド
正式名称は長いけど、エイリアスが貼ってあるので、 `cd`, `ls`, `cat`, `more` あたりは、似たような感じで使える。
### pbcopy
`clip`
日本語を扱う場合は、 `$outputencoding=[console]::outputencoding` 貼り付けてから実行するが吉
`Set-Clipboard` は、面倒そう
### pbpaste
`Get-Clipboard`
### *shrc
```
PS >New-item –type file –force $profile
```
しといて、できたファイルに
```
$outputencoding=[console]::outputencoding
New-Alias pbpaste Get-Clipboard
New-Alias pbcopy clip
```
なんぞ書く。