ฉันจะเลือกหลายคอลัมน์และขยายคุณสมบัติโดยใช้ PowerShell select-string -Allmatch ได้อย่างไร

ฉันกำลังค้นหาคอลเลกชั่นของไฟล์ข้อความ (*.sql) เพื่อหาตัวเลข 8 หลักที่ขึ้นต้นด้วย 9 ตัวเลขเหล่านี้อาจมีหลายอินสแตนซ์ในไฟล์ เช่นเดียวกับหลายอินสแตนซ์ในแต่ละบรรทัดในไฟล์ ฉันต้องการให้ผลลัพธ์แสดงการเกิดขึ้นที่ไม่ซ้ำกันของตัวเลข 8 หลักแต่ละตัวในแต่ละไฟล์ นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches |  %{$_.groups[0].value}}} | Select-Object  -unique FileName,Value  

และผลลัพธ์ของฉันมีลักษณะดังนี้:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      {907500507, 907520700, 907520701, 907520703...} 
File1.sql                      {907520725, 907520727, 907520728, 907520729} 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      {990603919, 990603925, 990603926} 
File2.sql                      {991100103, 991100103}
File2.sql                      {990700023, 990700504, 990700521, 990740520...} 
File3.sql                      907500044

ฯลฯ....

สิ่งที่ฉันต้องการทำคือขยายอาร์เรย์เพื่อที่ว่าเมื่อฉันไพพ์มันผ่าน select -unique ฉันจะได้รับเฉพาะตัวเลข 8 หลักที่ไม่ซ้ำกันในแต่ละไฟล์เท่านั้น

นี่คือสิ่งที่ฉันต้องการ:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      907500507
File1.sql                      907520700
File1.sql                      907520701
File1.sql                      907520703 
File1.sql                      907520725
File1.sql                      907520727
File1.sql                      907520728
File1.sql                      907520729 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      990603919
File2.sql                      990603925
File2.sql                      990603926 
File2.sql                      991100103
File2.sql                      990700023
File2.sql                      990700504
File2.sql                      990700521
File2.sql                      990740520 
File3.sql                      907500044

ฯลฯ...

ฉันจะทำเช่นนี้ได้อย่างไร? และคำสั่ง PowerShell ปัจจุบันของฉันสามารถปรับปรุงได้หรือไม่

ขอบคุณ!


person RayBan    schedule 15.05.2014    source แหล่งที่มา


คำตอบ (2)


ฉันฟอร์แมตคำสั่งใหม่เล็กน้อย ฉันคิดว่าลักษณะที่สั้นของ PowerShell ชวเลขทำให้มองเห็นปัญหาได้ยากขึ้น

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
    Select-Object  -unique FileName,Value 

คำสั่งเดิมของคุณให้ผลลัพธ์หนึ่งบรรทัดเอาต์พุตสำหรับแต่ละ MatchInfo ที่ส่งคืนโดย Select-String MatchInfo แสดงถึงบรรทัดที่ตรงกันของไฟล์ข้อความ ฉันเชื่อว่าคุณได้รับอาร์เรย์ของค่าเมื่อบรรทัดเดียวในไฟล์มีค่าที่ตรงกันมากกว่าหนึ่งค่า

ฉันแก้ไขมันเพื่อชี้แจงว่าเราต้องการหนึ่งออบเจ็กต์เอาต์พุตสำหรับแต่ละ RegexMatch ในแต่ละ MatchInfo ซึ่งก็คือพูดหนึ่งออบเจ็กต์เอาต์พุตสำหรับแต่ละค่าที่ตรงกัน

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 
person James    schedule 15.05.2014
comment
สวัสดี ขอบคุณสำหรับการตอบสนองอย่างรวดเร็วและคำอธิบาย การดำเนินการข้างต้นใช้งานได้ดี อีกทั้งฉันสามารถขยายโค้ดของคุณเพื่อรวมคุณสมบัติอื่นๆ บางอย่างที่ฉันไม่ได้รวมไว้ในตัวอย่างด้านบนได้ (จริงๆ แล้วฉันกำลังค้นหาหลายไดเรกทอรีย่อยและจำเป็นต้องแยกชื่อไดเรกทอรีหลักเพื่อรวมไว้ในการเลือกขั้นสุดท้าย) - person RayBan; 21.05.2014

โอเค ส่วนใหญ่จะหมดสิ่งที่คุณมี ฉันกำลังทำการวนซ้ำ ForEach กับรายการที่ตรงกันทั้งหมดที่พบใน Select-String และจัดกลุ่มตามชื่อไฟล์ จากนั้นสำหรับแต่ละไฟล์ ฉันจะวนซ้ำกลุ่มที่ขยาย Matches จากนั้นนำเฉพาะค่าที่ไม่ซ้ำสำหรับข้อความที่ตรงกัน สำหรับแต่ละค่า ฉันจะส่งออกออบเจ็กต์ที่มีชื่อไฟล์และค่าที่ตรงกัน

ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
    $File.group|select -expand matches|Select Value -Unique|%{
        new-object PSObject -property @{
            FileName=$File.Name
            Match=$_.value
        }
    }
}
person TheMadTechnician    schedule 15.05.2014
comment
รหัสของคุณใช้งานได้ แต่ฉันมีปัญหาในการขยายเพื่อรวมชื่อไดเรกทอรีหลักของไฟล์ที่ฉันกำลังค้นหาในหลายไดเรกทอรีย่อย (เป็นส่วนหนึ่งของวัตถุใหม่) - person RayBan; 21.05.2014