21

私は基本的な頭/尾の機能を追跡することができました:

head -10 myfile <==> cat myfile | select -first 10
tail -10 myfile <==> cat myfile | select -last 10

しかし、最後の3行を除くすべての行、または最初の3行を除くすべての行を一覧表示する場合、どのように行いますか?Unixでは、「head-n-3」または「tail-n+4」を実行できます。PowerShellでこれをどのように行うべきかは明らかではありません。

4

6 に答える 6

21

ここでは有用な情報が他の回答にも広がっていますが、簡潔な要約があると便利だと思います。

最初の3行を除くすべての行

1..10 | Select-Object -skip 3
returns (one per line): 4 5 6 7 8 9 10

最後の3行を除くすべての行

1..10 | Select-Object -skip 3 -last 10
returns (one per line): 1 2 3 4 5 6 7

つまり、組み込みのPowerShellコマンドを使用して実行できますが、入力するサイズを指定する必要があるという煩わしさがあります。簡単な回避策は、可能な入力よりも大きい定数を使用することであり、サイズを知る必要はありません。アプリオリ:

1..10 | Select-Object -skip 3 -last 10000000
returns (one per line): 1 2 3 4 5 6 7

よりクリーンな構文は、Keith Hillが提案したように、PowerShell Community ExtensionsのSkip-Objectコマンドレットを使用することです(Goyuixの回答のSkip-Last関数は同等に機能しますが、PSCXを使用するとコードを維持する必要がなくなります)。

1..10 | Skip-Object -last 3
returns (one per line): 1 2 3 4 5 6 7

最初の3行

1..10 | Select-Object –first 3
returns (one per line): 1 2 3

最後の3行

1..10 | Select-Object –last 3
returns (one per line): 8 9 10

真ん中の4行

(これは、呼び出しのパラメーターの順序に関係なく、がの-skip前に処理されるために機能します。)-first

1..10 | Select-Object -skip 3 -first 4
returns (one per line): 4 5 6 7
于 2012-04-11T20:30:36.917 に答える
9

-Firstおよび-Lastパラメーターと同様に、役立つ-Skipパラメーターもあります。-Skipはゼロではなく1ベースであることに注意してください。

# this will skip the first three lines of the text file
cat myfile | select -skip 3

PowerShellに、事前に作成された最後のn行を除くすべてを返すものがあるかどうかはわかりません。長さがわかっている場合は、行数からnを引いて、selectの-Firstパラメーターを使用できます。また、いっぱいになったときにのみ行を通過させるバッファを使用することもできます。

function Skip-Last {
  param (
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)][PsObject]$InputObject,
    [Parameter(Mandatory=$true)][int]$Count
  )

  begin {
    $buf = New-Object 'System.Collections.Generic.Queue[string]'
  }

  process {
    if ($buf.Count -eq $Count) { $buf.Dequeue() }
    $buf.Enqueue($InputObject)
  }
}

デモとして:

# this would display the entire file except the last five lines
cat myfile | Skip-Last -count 5
于 2012-04-09T22:14:40.880 に答える
2

PowerShell Community Extensionsを使用している場合は、最後のN項目を除くすべての出力を渡すTake-Objectコマンドレットがあります。例:

30# 1..10 | Skip-Object -Last 4
1
2
3
4
5
6
于 2012-04-09T22:37:47.647 に答える
1

あなたはこのようにそれを行うことができます:

[array]$Service = Get-Service
$Service[0] #First Item
$Service[0..2] #First 3 Items
$Service[3..($Service.Count)] #Skip the first 3 lines
$Service[-1] #Last Item
$Service[-3..-1] #Last 3 Items
$Service[0..($Service.Count -4)] #Skip the last 3 lines
于 2012-04-09T22:13:59.383 に答える
1

最後を除くすべてnはで行うことができます

... | select -skiplast $n
于 2017-11-09T19:22:39.103 に答える
0

最初を除くすべてnはで行うことができます

... | Select -skip $n

ただし、すべての「最後を除く」mには何も組み込まれていません。入力全体を配列にロードして長さを取得することは可能です。もちろん、メモリに不当な要求を課す可能性のある大きな入力の場合です。

于 2012-04-09T21:58:47.130 に答える