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-ID: 270021

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

114757
Lösung 114757 23.04.2015 aktualisiert um 14:48:46 Uhr
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
ole-objekt
ole-objekt 23.04.2015 um 14:17:24 Uhr
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
114757
114757 23.04.2015 um 14:48:31 Uhr
Goto Top
Hatte ich ja oben ergänzt Parameter -Autosize -Wrap