ole-objekt
Goto Top

Batch: Vorkommen eines strings in mehreren Dateien zählen und pro Datei ausgeben

Hallo,

ich muss später über 180 Dateien (mehr als 3 GB) auf das Auftreten bestimmter Strings durchsuchen um zu vergleichen, wie sich die verschiedenen Dateien unterscheiden. Bisher habe ich ein wenig zusammengebastelt, allerdings erfolgt die Ausgabe der Zählvariable, bevor sie gefüllt wird. Was mache ich falsch bzw. welchen ganz anderen Ansatz (ggf. powershell) gibt es?

Im folgenden habe ich Pfad, Dateinamen, Suchstring usw angepasst, damit es besser lesbar ist.


Mein bisheriger Code liegt in der Datei ABCsuchen.bat:

set suchstring="ABC"
set datei=%suchstring%-Anzahl.txt
set pfad=D:\test\teil1
set /a Anzahl=0

for %%f in (%pfad%\*) do (
set /a Anzahl=0
for /f "delims=)" %%i in ('findstr /c:%suchstring% %%f^|findstr /n "^"') do set /a Anzahl=%%i
echo %%~nf : %Anzahl% >> %datei% )


Im angegebenen Pfad liegt derzeit nur eine Datei testdatei.txt mit folgendem Inhalt:

ABC
DEF
ABC
GHI
JKL
ABC
MNO


Ich rufe aus der cmd-shell auf: ABCsuchen.bat > log.txt

In der cmd-shell sehe ich daraufhin:
Fehlender Operator
Fehlender Operator
Fehlender Operator


Die entstehende Ergebnis-Datei ABC-Anzahl.txt enthält:

testdatei : 0


In der Datei log.txt steht dann auch die Erklärung:

D:\test>set suchstring="ABC"

D:\test>set datei="ABC"-Anzahl.txt

D:\test>set pfad=D:\test\teil1

D:\test>set /a Anzahl=0

D:\test>for %f in (D:\test\teil1\*) do (
set /a Anzahl=0
for /F "delims=)" %i in ('findstr /c:"ABC" %f|findstr /n "^"') do set /a Anzahl=%i
echo %~nf : 0 1>>"ABC"-Anzahl.txt
)

D:\test>(
set /a Anzahl=0
for /F "delims=)" %i in ('findstr /c:"ABC" D:\test\teil1\testdatei.txt|findstr /n "^"') do set /a Anzahl=%i
echo testdatei : 0 1>>"ABC"-Anzahl.txt
)

D:\test>set /a Anzahl=1:ABC

D:\test>set /a Anzahl=2:ABC

D:\test>set /a Anzahl=3:ABC


Schon mal Danke an alle, die überhaupt bis hier unten gelesen haben - Antworten werden natürlich gerne entgegen genommen face-wink

ole-objekt

Content-Key: 270021

Url: https://administrator.de/contentid/270021

Printed on: April 25, 2024 at 07:04 o'clock

Mitglied: 114757
Solution 114757 Apr 23, 2015 updated at 12:48:46 (UTC)
Goto Top
Mit Powershell schnell erledigt:
Für eine Gesamtanzahl an Matches aller Files:
$suchwort = "ABC"  
$cnt = 0
gci 'c:\quellordner\*.txt' | %{$cnt += [regex]::matches((gc $_.Fullname),[regex]::Escape($suchwort)).Count}  
write-host "Anzahl der Einträge gefunden: $cnt"  
oder noch kompakter mit Auflistung der Dateinamen und Anzahl Matches:
select-string -Path "C:\quellordner\*.txt" -SimpleMatch -Pattern "ABC" | group Path | ft name,count -AutoSize -Wrap
Gruß jodel32
Member: ole-objekt
ole-objekt Apr 23, 2015 at 12:17:24 (UTC)
Goto Top
Oh, ich sehe gerade, dass der Pfad so lang ist, dass die Dateinamen nicht mehr lesbar sind. Kann man da etwas machen?

Name Count
-----
H:\Testvergleich\ETN\Rohdaten\fahrte... 3283
H:\Testvergleich\ETN\Rohdaten\fahrte... 142
H:\Testvergleich\ETN\Rohdaten\fahrte... 8
H:\Testvergleich\ETN\Rohdaten\fahrte... 205
H:\Testvergleich\ETN\Rohdaten\fahrte... 62
Mitglied: 114757
114757 Apr 23, 2015 at 12:48:31 (UTC)
Goto Top
Hatte ich ja oben ergänzt Parameter -Autosize -Wrap