ฉันจะรับหมายเลขบรรทัดด้วย PowerShell ได้อย่างไร


5

ฉันมีไฟล์ข้อความง่ายๆ:

$ cat food.txt
Apples
Bananas
Carrots

ลินุกซ์ / Cygwin

และฉันสามารถคิดถึงวิธีรับหมายเลขบรรทัดใน 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

สิ่งที่ดีที่สุดที่ฉันคิดไว้คือ:

อัพเดท 2017-11-27Mo : (1) เพิ่มการปรับแต่งเล็กน้อย: Out-String -Streamเพื่อบังคับให้เป็นวัตถุที่น่ารำคาญ (2) หมายเหตุ: ฉันกำลังมองหาบางอย่างที่จะยอมรับ 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

มีวิธีที่ง่ายกว่านี้ไหม? ลงเรื่อย ๆ ? มีบางอย่างในตัวกับ PowerShell


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

จะแค่: select-string file.txt -pattern "." มีประโยชน์อะไรบ้าง?
ช่วยมือ

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

1
cat .\food.txt|%{ "{0,4} {1}" -f $_.ReadCount,$_ }การสร้างบน @JosefZ แต่ตัวเลขถูกต้อง
LotPings

@LotPings น่าจะเป็นที่สั้นที่สุดและตรงไปตรงมาที่สุด
Bill_Stewart

คำตอบ:


1

ฉันห่อของฉันไว้ในฟังก์ชั่นที่คุณอาจรวมไว้ในโปรไฟล์ Powershell ของคุณ

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,$_ }
    }
  }
}

ตัวอย่างผลลัพธ์:

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

นั่นเป็นทางออกที่ดี ขอบคุณ มีวิธี (ง่าย) ที่สามารถปรับให้รับอินพุตไปป์ไลน์ได้หรือไม่? (นี่คือสิ่งที่ฉันต้องการจริงๆ)
StackzOfZtuff

@StackzOfZtuff ชำระเงินคำตอบของฉัน
Keltari

1

สิ่งนี้จะทำและจะทำงานกับคำสั่งใด ๆ ที่สร้างผลลัพธ์:

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

นี่คือผลลัพธ์:

1        Apples
2        Bananas
3        Carrots

นี่คือตัวอย่างถ้ามีรายชื่อไดเรกทอรี:

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

นี่คือผลลัพธ์:

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

แน่นอนถ้าคุณต้องการหมายเลขบรรทัดที่จะเริ่มต้นที่ 0 $i = 0แล้วตั้ง


หรือทำ$i=1; dir | % {"$($i) `t $_"; $i++}มากกว่าการเพิ่มตัวแปรก่อนที่คุณต้องการแล้วลบออกจากมัน
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.