0

私はPowerShellの新しいユーザーです。3列の同様のデータセットを持つ30個のファイルがあります。列のデータはLatLongValueです。以下に示すようなヘッダーもあります。ただし、列にはラベルが付いていません。

サンプルデータは次のようになります。

* , Water Column, Depth Averaged
   437416.450  3350091.975        0.000
   437379.500  3350133.550        0.000
   437583.925  3350278.375        0.000
   437545.475  3350312.800        0.000
   437768.700  3350492.125        0.000
   437730.675  3350525.050        0.000
   437919.750  3350668.850        0.000
   437883.350  3350701.150        0.000
   438072.475  3350836.850        0.000
   438039.500  3350871.075        0.000
   438221.250  3350960.400        0.000
   438189.300  3351005.500        0.000
   438381.025  3351048.025        0.000
   438346.900  3351107.250        0.000
   438588.600  3351155.800        0.000
   438548.000  3351225.825        0.000
   438802.400  3351278.925        0.002
   438753.750  3351354.150        0.001
   439000.525  3351414.850        0.013
   438946.625  3351488.475        0.009
   439181.000  3351557.950        0.064
   439126.725  3351626.025        0.048
   439361.600  3351708.700        0.277
   439308.550  3351773.525        0.227

同じフォルダ内のすべてのファイルから各行の値の平均を計算したいと思います。基本的に、最初の行には、30個のファイルからの平均30個のデータポイントがあります。PowerShellは単純なアルゴリズムで実行できるのではないかと思いました。

stackoverflowで複数のファイルからawkを使用して平均を計算する同様の投稿を見つけましたが、それがどのように実装されているか理解できませんでした。

Powershellが複数のファイルの同じ列から実際に平均を計算する方法を誰かが理解するのを手伝ってもらえますか?同様の列を持つ新しいファイルを作成したいと思います。緯度と平均。

ありがとう

Jdbaba

4

1 に答える 1

1

確かにもっと効率的な方法がありますが、ここに1つあります:

$results=@{}

#assuming your files are tab delimited and named position1.csv, position2.csv ...:
ls c:\temp\position*.csv | foreach
    {
    get-content $_.fullname | foreach
    {
        $slices=$_.split("`t")
        #verify we have our 3 columns
        if( $slices.count -eq 3)
        {
            #create an hash table with latitude-longitude as key
            $key=$slices[0]+"-"+$slices[1]

            if( $results.count -ne 0 -and $results.GetEnumerator().name -contains $key ) {
                $results[$key]+=$slices[2]
            }
            else{
                $results[$key]=@($slices[2])
            }
        }
    }
}

$results.GetEnumerator().name |%{
   "{0}`t{1}`t{2}" -f ($_.split("-")[0]) , ($_.split("-")[1]) , ($results[$_] | Measure-Object -Average).Average
}
于 2013-02-04T07:28:23.953 に答える