web-dev-qa-db-ja.com

「head-n-3」に相当するPowerShell?

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

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でどのように行うべきかは明らかではありません。

20
likso

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

first3を除くすべての行

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

last3を除くすべての行

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

最初

1..10 | Select-Object –first 3
returns (one per line): 1 2 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
21
Michael Sorens

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

30# 1..10 | Skip-Object -Last 4
1
2
3
4
5
6
2
Keith Hill

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

[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
1
HungryHippos

最後のnを除くすべては、

... | select -skiplast $n
1
Ryan

最初のn以外はすべて次のコマンドで実行できます

... | Select -skip $n

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

0
Richard