我试图以有效的方式获取“file1”中的字符串(从 40 到 400+ 个字符)出现在“file2”中的次数。file1 有大约 2k 行,file2 有大约 130k 行。我目前有一个 Unix 解决方案,它在 VM 中大约需要 2 分钟,在Cygwin中大约需要 5 分钟,但我正在尝试使用 Powershell/Python 来完成它,因为文件在 Windows 中,我正在使用 excel 中的输出并使用它使用自动化(AutoIT。)
我有一个解决方案,但它需要的时间太长(大约在 Cygwin 完成的同一时间 - 所有 2k 行 - 我在 Powershell 中只有 40-50 行!)虽然我还没有准备解决方案,如果有快速准确的解决方案,我也愿意使用 Python。
这是Unix代码:
while read SEARCH_STRING;
do printf "%s$" "${SEARCH_STRING}";
grep -Fc "${SEARCH_STRING}" file2.csv;
done < file1.csv | tee -a output.txt;
这是我目前拥有的 Powershell 代码
$Target = Get-Content .\file1.csv
Foreach ($line in $Target){
#Just to keep strings small, since I found that not all
#strings were being compared correctly if they where 250+ chars
$line = $line.Substring(0,180)
$Coll = Get-Content .\file2.csv | Select-string -pattern "$line"
$cnt = $Coll | measure
$cnt.count
}
任何建议的想法都会有所帮助。
谢谢。
编辑
我正在尝试 CB 建议的修改后的解决方案
del .\output.txt
$Target = Get-Content .\file1.csv
$file= [System.IO.File]::ReadAllText( "C:\temp\file2.csv" )
Foreach ($line in $Target){
$line = [string]$line.Substring(0, $line.length/2)
$cnt = [regex]::matches( [string]$file, $line).count >> ".\output.txt"
}
但是,由于我在 file1 中的字符串长度不同,我不断收到 SubString 函数的 OutOfBound 异常,因此我将输入字符串减半(/2)以尝试获得匹配。当我尝试将它们减半时,如果我有一个左括号,它会告诉我:
Exception calling "Matches" with "2" argument(s): "parsing "CVE-2013-0796,04/02/2013,MFSA2013-35 SeaMonkey: WebGL
crash with Mesa graphics driver on Linux (C" - Not enough )'s."
At C:\temp\script_test.ps1:6 char:5
+ $cnt = [regex]::matches( [string]$file, $line).count >> ".\output.txt ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException
我不知道是否有办法提高 powershell 中的输入限制(我目前最大的大小是 406,但将来可能会更大)或者干脆放弃尝试 Python 解决方案。
想法?
编辑
感谢@CB,我得到了正确的答案,它与 Bash 脚本的输出完美匹配。以下是将结果输出到文本文件的完整代码:
$Target = Get-Content .\file1.csv
$file= [System.IO.File]::ReadAllText( "C:\temp\file2.csv" )
Foreach ($line in $Target){
$cnt = [regex]::matches( $file, [regex]::escape($line)).count >> ".\output.txt"
}