सरल तरीके से वर्तमान निर्देशिका में अधिकांश लाइनों के साथ पांच फाइलें कैसे प्राप्त करें?

Jan 09 2021

"द प्रोगैमैटिक प्रोग्रामर" के अध्याय "ट्रांसफॉर्मल प्रोग्रामिंग" में ऐसा शेल कमांड है।

इसका कार्य वर्तमान निर्देशिका में सबसे अधिक पंक्तियों वाली पांच फाइलों को सूचीबद्ध करना है।

$ find . -type f | xargs wc -l | sort -n | tail -6 | head -5
     470 ./debug.pml
     470 ./test_to_build.pml
     487 ./dbc.pml
     719 ./domain_languages.pml
     727 ./dry.pml

मैं PowerShell Power के साथ एक ही काम करने की कोशिश कर रहा हूं, लेकिन यह बहुत बुरा लगता है

(Get-ChildItem .\ | ForEach-Object {$_ | Select-Object -Property 'Name', @{label = 'Lines'; expression = {($_ | Get-Content).Length}}} |Sort-Object -Property 'Lines')|Select-Object -Last 5

मेरा मानना ​​है कि एक सरल तरीका होगा, लेकिन मैं इसके बारे में सोच भी नहीं सकता।

PowerShell का उपयोग करके सरलतम तरीके से वर्तमान निर्देशिका में अधिकांश लाइनों वाली फाइलें कैसे प्राप्त करें?

बेशक, आपको लंबाई कम करने के लिए कस्टम एलियास और संक्षिप्ताक्षरों का उपयोग करने की आवश्यकता नहीं है। यद्यपि यह अधिक संक्षिप्त लगता है, यह पठनीयता खो देता है।

जवाब

2 iRon Jan 09 2021 at 20:05
Get-Content * | Group-Object PSChildName | Select-Object Count, Name |
    Sort-Object Count | Select-Object -Last 5
1 if_ok_button Jan 10 2021 at 09:02

मुझे आखिरकार मेरा अपना संतोषजनक जवाब मिल गया!

3 पाइपलाइन ऑपरेटरों का इस्तेमाल किया, शेल का इस्तेमाल किया 5!

क्या अधिक है, जो हमें मिलता है वह वस्तु है, जिसका उपयोग अधिक एक्सटेंसिबल संचालन के लिए किया जा सकता है।

मुझे लिनेक्स के खोल से बेहतर लगता है।

dir -file | sort {($_ | gc).Length} | select -l 5
pwnosh Jan 09 2021 at 16:42

फ़ाइल गुण के साथ या तो फ़ाइल की कोशिश करें।

File.ReadLines

Get-ChildItem .\ -File | 
    Select-Object -Property Name, @{n='Lines'; e= { 
            [System.Linq.Enumerable]::Count([System.IO.File]::ReadLines($_.FullName)) 
        } 
    } | Sort-Object -Property 'Lines' -Descending | Select-Object -First 5

File.ReadAllLines

Get-ChildItem .\ -File | 
    Select-Object -Property Name, @{n='Lines'; e= { 
            [System.IO.File]::ReadAllLines($_.FullName).Count 
        } 
    } | Sort-Object -Property 'Lines' -Descending | Select-Object -First 5
Theo Jan 09 2021 at 18:35

उपयोग करने के लिए एक तेज़ तरीका होगा switch -File:

$files = (Get-ChildItem -File ).FullName $result = foreach ($file in $files) {
    $lineCount = 0 switch -File $file {
        default { $lineCount++ } } [PsCustomObject]@{ File = $file
        Lines = $lineCount } } $result | Sort-Object Lines | Select-Object -Last 5