【问题标题】:Powershell delete duplicate line has start same of otherPowershell删除重复行与其他行相同
【发布时间】:2020-08-13 09:42:41
【问题描述】:

在 powershell 中我想在 txt 文件中删除重复的行,当它们开始相似时:

https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789

应该成为我的txt文件:

https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789

因为我数了3次:https://mysite.local/9999/9999_01_01.jpg,所以每个jpg文件只需要一次:9999_01_00.jpg

我怎样才能做到这一点?删除重复的行不是很难,但是当行不完全相似时就有点困难了!

谢谢!

【问题讨论】:

    标签: string powershell file duplicates


    【解决方案1】:

    一种方法是:

    $newText = Get-Content -Path 'X:\FileWithUrls.txt' |
                Group-Object @{Expression = { ($_ -split '\?')[0]}} | 
                ForEach-Object { $_.Group[0] }
    
    # output on screen
    $newText
    
    # output to new text file
    $newText | Set-Content -Path 'X:\DeDupedFileWithUrls.txt' -Force
    

    输出:

    https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789 https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789 https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789 https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789


    小解释:

    Group-Object 将文本文件中的相似行组合在一起。
    这是基于我们提供的一个属性,在这种情况下,它是字符串 before ? 的一部分。

    要做到这一点,我们只需拆分问号上的字符串,只使用第一部分[0]

    因为-split 使用正则表达式,我们需要使用\? 转义它

    这是用@{Expression = { ($_ -split '\?')[0]}} 包裹在一个计算的(即时)属性中

    接下来我们循环遍历这些组并只输出每个组的第一项

    【讨论】:

    • 它工作得很好我会尝试理解解决方案非常感谢你能解释一下这部分是如何工作的吗? Group-Object @{Expression = { ($_ -split '\?')[0]}} | ForEach-Object { $_.Group[0] }
    • @VeilleurTryToFix 我已经为你添加了一些解释。
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2021-10-21
    • 2014-03-09
    • 2017-03-02
    相关资源
    最近更新 更多