Вы можете прочитать содержимое файла с помощью Get-Content
или cat
, а затем превратить его в массив, разделив на \n
$lines = (Get-Content $filepath).split('\n')
Затем вы можете выполнить итерацию по каждой строке и разделить ее on '', а затем выполните итерацию по этому массиву и суммируйте нужные вам значения
for($i=0;$i -lt $lines.length;$i++){
$numsInLine = $lines[i].split(' ')
$lineSum = 0
for($j=0;$j -lt $numsInLine.length;$j++){
if($numsInLine[j] % 2 -eq $i % 2){ #$i is the line number, $numsInLine[j] is a number in that line
$lineSum++
}
}
Write-Host $lineSum
}
Изменить: в ответ на комментарий Lee_Dailey% в этом содержимом является оператором по модулю. x% 2 возвращает четность x, а это именно то, что вам здесь нужно.
Также обратите внимание, что %
в powershell - это псевдоним для ForEach-Object
. %
или ForEach-Object
в PowerShell - это простой для каждого l oop, перебирающий все значения в массиве с более простым синтаксисом, но без индекса. В нашем случае я бы рекомендовал использовать его вместо второго только для l oop, поскольку мы используем индексную переменную в первой (используется примечание i
). В этом случае второй l oop будет выглядеть так:
$numsInLine | %{ #or $numsInLine | ForEach-Object
if($_ % 2 -eq $i % 2){ #$_ refers to the last returned object
$lineSum++
}
}
Обратите внимание на две вещи:
1. %
или ForEach-Object
всегда используются после конвейера, поскольку они должен получить InputObject. InputObject также должен быть итеративным. Вот как различаются% по модулю и% по foreach.
$_
используется здесь как текущий повторяемый элемент. В нашем повторяемом элементе нет именованной переменной, отражающей его.
$_
обычно используется, в частности, в конвейере и циклах foreach (однако вы можете использовать его и в любом другом случае).
Другой логически равный синтаксис:
foreach($num in $numsInLine){
if($num % 2 -eq $i % 2){
$lineSum++
}
}
Обратите внимание, что здесь нет конвейера или $_
не требуется.