powershell - 如何在Powershell中转置数据

标签 powershell transpose

我有一个看起来像这样的文件:
1
,2
约3
a,4
b,5
约6
(...重复1,000线)

我怎样才能将它转换成这个?
a,b,c
1,2,3
4,5,6

谢谢

最佳答案

这是一个来自 hell 的蛮力一线将做到的:

PS> Get-Content foo.txt | 
      Foreach -Begin {$names=@();$values=@();$hdr=$false;$OFS=',';
                      function output { if (!$hdr) {"$names"; $global:hdr=$true}
                                        "$values";
                                        $global:names=@();$global:values=@()}} 
              -Process {$n,$v = $_ -split ',';
                        if ($names -contains $n) {output};
                        $names+=$n; $values+=$v } 
              -End {output}
a,b,c
1,2,3
4,5,6

这不是我所说的优雅,但应该可以帮助您。这应该照原样正确复制/粘贴。但是,如果将其重新格式化为上面显示的内容,则需要在Begin和Process脚本块的最后一次 curl 之后放回勾号。该脚本需要PowerShell 2.0,因为它依赖于新的-split运算符。

此方法大量使用了Foreach-Object cmdlet。通常,在管道中使用Foreach-Object(别名为Foreach)时,只需指定一个脚本块,如下所示:
Get-Process | Foreach {$_.HandleCount}

打印出每个进程的句柄计数。 Foreach-Object的这种用法隐式使用-Process脚本块,这意味着它对从管道接收到的每个对象执行一次。现在,如果我们要总计每个进程的所有句柄,该怎么办?忽略您仅可以使用Measure-Object HandleCount -Sum做到这一点的事实,我将向您展示Foreach-Object如何做到这一点。正如您在此问题的原始解决方案中看到的那样,Foreach可以采用对管道中的第一个对象执行一次的Begin脚本块和在管道中没有更多对象时执行的End scripblock。这是使用Foreach-Object总计句柄计数的方法:
gps | Foreach -Begin {$sum=0} -Process {$sum += $_.HandleCount } -End {$sum}

与此相关的问题解决方法是,在Begin脚本块中,我初始化了一些变量来保存名称和值的数组,以及一个 bool(boolean) 值($ hdr),该 bool(boolean) 值告诉我是否已输出 header (我们只想输出一次)。下一个让人不寒而栗的事情是,我还在Begin脚本块中声明了一个函数(输出),我从Process和End脚本块中调用该函数以输出存储在$ names和$ values中的当前数据集。

唯一的另一招是Process脚本块使用-contains运算符来查看当前行的字段名称是否已经被查看过。如果是这样,则输出当前名称和值并将这些数组重置为空。否则,只需将名称和值存储在适当的数组中,以便以后保存。

顺便说一句,输出函数需要对变量使用global:说明符的原因是,当嵌套作用域修改其作用域之外定义的变量时,PowerShell将执行“写时复制”方法。但是,当我们确实希望该修改在更高的范围内发生时,我们必须通过使用诸如global:或script:这样的修改器来告诉PowerShell。

关于powershell - 如何在Powershell中转置数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1736613/

相关文章:

azure - 您的 Azure 凭据尚未设置或已过期,请运行 Connect-AzAccount 来设置您的 Azure 凭据

c# - Add-Migration 命令只提示 "ScriptHalted"

MySQL行动态列

mysql - 转置表 Mysql

Powershell网站登录无法正常工作

amazon-web-services - 使用 PowerShell Core 上传到 Amazon S3 存储桶

c++ - 用于矩形矩阵转置的就地 CUDA 内核

optimization - 使用 SSE、AVX 和 OpenMP 进行快速内存转置

json - ConvertFrom-json中的哈希表与Powershell内置哈希表的类型不同,如何使它们相同?

python - 在 Pandas 中转置非结构化行