powershell 查找存在于两个列表中的项目

vyu0f0g1  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(163)

我有一个清单,看起来是这样的:

10.0139_ssrn.3771318
10.1001_archdermatol.2012.418
10.1001_archinte.165.15.1737
10.1001_archinte.165.15.1743
10.1001_archinte.165.18.2142
10.1001_archinternmed.2012.127

我还有另一个清单,看起来是这样的:

123 10.0139_ssrn.3771318    
356 10.1001_archdermatol.2012.418
357 10.1001_archinte.165.15.1737    
6   10.1001_archinternmed.2012.127
379 10.1001_archopht.123.1.25   
12  10.1001_archoto.2010.121    
97  10.1001_archotol.127.1.25

第二个列表不包含第一个列表中的所有项,反之亦然。
我想创建一个仅包含匹配项的文件,如下所示:

123 10.0139_ssrn.3771318    
356 10.1001_archdermatol.2012.418
357 10.1001_archinte.165.15.1737    
6   10.1001_archinternmed.2012.127

我可以使用PowerShell中的以下命令以我想要的方式提取各行:

Get-Content 'Y:\folder\second_list.csv' | foreach {
  $_ -match "10.0139_ssrn.3771318"}| Out-File 'Y:\folder\10.0139_ssrn.3771318'

我没有设法编写一个从第一个文件中提取条目的循环。我试过这样的方法:

Get-Content 'Y:\folder\second_list.csv' | foreach {
  $line -contains (Get-Content "Y:\folder\first_list.csv")| Out-file "Y:\folder\output.csv" -append}

有两个问题:第一,没有识别出匹配项(尽管应该有一些匹配项),第二,输出文件中的条目总是“假”(而不是Second_list的匹配行,或者如果没有找到匹配项,则根本没有条目)。

gr8qqesn

gr8qqesn1#

我制作了两个样例文件:test1.csv:

header
"10.0139_ssrn.3771318356"
"10.1001_archdermatol.2012.418"
"10.1001_archinte.165.15.17376"
"10.1001_archinternmed.2012.127"
"10.1001_archopht.123.1.2512"
"10.1001_archoto.2010.12197"
"10.1001_archotol.127.1.25"

Est2.csv:

header
"10.0139_ssrn.3771318356"
"10.1001_archdermatol.2012.418"
"10.1001_archinte.165.15.1737"
"10.1001_archinte.165.15.1743"
"10.1001_archinte.165.18.2142"
"10.1001_archinternmed.2012.127"

然后循环文件1中的所有项,并检查它们是否出现在文件2中:

$csv1 = Import-Csv "E:\users\temp\test1.csv"
$csv2 = Import-Csv "E:\users\temp\test2.csv"
$elementsToKeep = @()
foreach ($element1 in $csv1) {
    foreach ($element2 in $csv2) {
        if ($element1.header -eq $element2.header) {
            $elementsToKeep += $element1
        }
    }
}

$elementsToKeep | Export-Csv "E:\users\temp\output.csv" -NoTypeInformation

Output.csv的内容:

"header"
"10.0139_ssrn.3771318356"
"10.1001_archdermatol.2012.418"
"10.1001_archinternmed.2012.127"
wgxvkvu9

wgxvkvu92#

尝试以下操作:

$filename = "c:\temp\test.csv"
$list1 = @("10.0139_ssrn.3771318", ` 
          "10.1001_archdermatol.2012.418", ` 
          "10.1001_archinte.165.15.1737", `
          "10.1001_archinte.165.15.1743", `
          "10.1001_archinte.165.18.2142", `
          "10.1001_archinternmed.2012.127")
$csv = Import-Csv -Path $filename -Header 'number', 'name'
$csv | Format-Table
$filteredData = $csv.Where({$list1.Contains($_.name)})
$filteredData | Format-Table

以下是输出

number name
------ ----
123    10.0139_ssrn.3771318
356    10.1001_archdermatol.2012.418
357    10.1001_archinte.165.15.1737
6      10.1001_archinternmed.2012.127
379    10.1001_archopht.123.1.25
12     10.1001_archoto.2010.121
97     10.1001_archotol.127.1.25

number name
------ ----
123    10.0139_ssrn.3771318
356    10.1001_archdermatol.2012.418
357    10.1001_archinte.165.15.1737
6      10.1001_archinternmed.2012.127

相关问题