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
# }
# }
なんてお茶を濁す作業。
追記
ヘッダ無しの場合のコード。ヘッダありの場合は、yumura_sさんのご指摘通り、一発ですね。
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" 文字列が長くなると後半が切れてしまって悲惨なことになる。
-
Format-Table -Autosize
で、切れなくは出来る。
-
試行錯誤中だった時のスクリプト
まあ、配列の作り方やらを備忘しとくのに。
$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
なんぞ書く。