我希望您能从本质上帮助我,我正在寻找与awk命令等效的Powershell :
awk '/"Box11"/ { print $0 }' test.txt|awk '{ SUM += $4} END { print SUM} '
小智 7
我知道这篇文章很旧,但我想我应该对此进行补充。目前,如果您启用了 WSL(适用于 Linux 的 Windows 子系统)(支持虚拟化的系统上的 Windows 10 所有版本,则打开 Windows 功能)并在子系统中安装了发行版。您可以直接从Windows调用Linux命令
wsl -e awk '/"Box11"/{sum += $4} END{print sum}' test.txt
(借用@Ed Moritn)(或您选择的任何 awk 命令。)基本上 cmd 或 PowerShell 接受命令并将其通过管道传输到子系统中,然后返回结果(有点过于简化,但实际上是准确的)。但 -e 标志允许您在不打开实例的情况下执行命令。
编辑 自从写完这个最初的回复以来,我找到了两个更好的解决方案的答案。第一个是GNUwin32,这是 Gnutils 的集合,已移植到 Windows 独立 .exe 文件,包括 sed、awk、grep 等,允许您调用 get-childitem | 直接 awk.exe '{print $1}'。这些工具完全便携,无需安装。第二个选择是 Msys32,这是一个从 Chocolatey 发展而来的平台(尽管现在它几乎完全是代码独立的),专为交叉编译二进制文件而设计。一旦安装在 /bin 文件夹中,就会有许多 Linux 实用程序作为 exe 文件。大多数可执行文件可以从 bin 中提取,并且可以移植,无需安装依赖项。msys32(在我的书中)优于 gnuwin32 的原因是 gnuwin32 有 gawk 版本 3.1,而 msys32 有 nawk 和 gawk vs 5.1。
这样做的方法多种多样,但这可以解决问题:
Get-Content c:\temp\test.txt | Where-Object{$_ -match '"Box11"'} |
  ForEach-Object{($_ -split "\s+")[3]} | Measure-Object -Sum |
  Select-Object -ExpandProperty Sum
获取文件的字符串数组。对于包含字符串的每一行,"Box11"我们在每组空格处将其分割。然后将每个匹配项的4个元素传递给Measure-Object。
如果您重视这一点,则简而言之如下所示:
gc c:\temp\test.txt | ?{$_ -match '"Box11"'} | %{($_ -split "\s+")[3]} |
  Measure -Sum | Select -Exp Sum
如果此文件/字符串输入具有标题,那么这也是一个不错的开始。当然,假设您的文件正好用一个空格分隔。
Get-Content c:\temp\test.txt | ConvertFrom-Csv -Delimiter " "
| 归档时间: | 
 | 
| 查看次数: | 13233 次 | 
| 最近记录: |