Làm cách nào để có được số dòng với PowerShell?


5

Tôi có một tệp văn bản đơn giản:

$ cat food.txt
Apples
Bananas
Carrots

Linux / Cygwin

Và tôi có thể nghĩ ra một số cách để có được số dòng trong Linux / Cygwin:

$ nl food.txt
     1  Apples
     2  Bananas
     3  Carrots

$ cat -n food.txt
     1  Apples
     2  Bananas
     3  Carrots

$ less -NFX food.txt
      1 Apples
      2 Bananas
      3 Carrots

PowerShell

Điều tốt nhất tôi nghĩ ra là đây:

Cập nhật 2017-11-27Mo : (1) Đã thêm chỉnh sửa nhẹ: Out-String -Streamđể buộc văn bản hóa các đối tượng phiền phức đó. (2) Lưu ý: Tôi đang tìm kiếm thứ gì đó sẽ chấp nhận PIPELINE INPUT.

PS C:\> function nl{$input | Out-String -Stream | Select-String '.*' | Select-Object LineNumber, Line}

PS C:\> cat .\food.txt | nl
LineNumber Line
---------- ----
         1 Apples
         2 Bananas
         3 Carrots

đó có phải là cách dễ hơn? Ngắn hơn? Một cái gì đó được tích hợp với PowerShell?


1
cat .\food.txt | select @{ n='LineNumber'; e='ReadCount' }, @{ n='Line'; e={$_} }
PetSerAl

Sẽ chỉ: select-chuỗi file.txt -potype "." được sử dụng?
HelpingHand

1
cat .\food.txt | %{ "$($_.ReadCount) $_" }
JosefZ

1
cat .\food.txt|%{ "{0,4} {1}" -f $_.ReadCount,$_ }xây dựng trên @JosefZ nhưng con số chính đáng
LotPings

Có lẽ @LotPings là ngắn nhất và đơn giản nhất.
Bill_Stewart

Câu trả lời:


1

Tôi gói dòng của tôi vào một chức năng mà bạn có thể bao gồm trong một trong các cấu hình Powershell của bạn.

Function nl 
{
<# .Synopsis
    Mimic Unic / Linux tool nl number lines
   .Description
    Print file content with numbered lines no original nl options supported
   .Example
     nl .\food.txt
#>
  param (
    [parameter(mandatory=$true, Position=0)][String]$FileName
  )

  process {
    If (Test-Path $FileName){
      Get-Content $FileName | ForEach{ "{0,5} {1}" -f $_.ReadCount,$_ }
    }
  }
}

Đầu ra mẫu:

> nl .\food.txt
    1 Apples
    2 Bananas
    3 Carrots

Đó là một giải pháp tốt đẹp. Cảm ơn. Có cách nào (đơn giản) có thể được điều chỉnh để chấp nhận đầu vào đường ống không? (Đây là những gì tôi thực sự muốn.)
StackzOfZtuff

@StackzOfZtuff kiểm tra câu trả lời của tôi
Keltari

1

Điều này sẽ làm điều đó và sẽ làm việc với bất kỳ lệnh nào tạo ra đầu ra:

$i = 1; cat food.txt | % {$i++;"$($i-1) `t $_"}

Đây là đầu ra:

1        Apples
2        Bananas
3        Carrots

Dưới đây là một ví dụ nếu với một danh sách thư mục:

$i = 1; dir | % {$i++;"$($i-1) `t $_"}

Đây là đầu ra:

1        backgrounds
2        boot
3        inetpub
4        PerfLogs
5        Program Files
6        Program Files (x86)
7        Riot Games
8        Users
9        Windows
10       Reflect_Install.log

Rõ ràng, nếu bạn muốn đánh số dòng bắt đầu từ 0, thì hãy đặt $i = 0.


Hoặc làm $i=1; dir | % {"$($i) `t $_"; $i++}, thay vì tăng biến trước khi bạn muốn, và sau đó trừ đi một biến từ nó.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.