Windowsでは、文字列がファイルに現れる回数を数える方法があります


2

現在、バッチスクリプトを作成しようとしています。この時点で、 "null"という文字列を見つけて、ファイルに何回表示されるかを判断する必要があります。

スクリプトが開始されるたびにWebサイトからAPIをダウンロードしていますが、そのAPI内では時々「null」になっています。それらのAPIがダウンロードされるとき、それは単一行にダウンロードされ、私はこれを試みています:

findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt

しかし、ファイルの長さは1行しかないため、これは "1"のみを表示します。

ファイルに "null"が含まれている回数を出力する他の方法はありますか?

barlopによって追加された
OPはまた、彼がサードパーティ製のソフトウェアをインストールすることはできないと述べたばかりです。


ちょっと待って、ファイルの中で特定の文字列を見つけて、append(>>)と私が以前使っていた私のコマンドを使ってそれらをファイルに出力できるか?
user347636

あなたが何かをインストールすることはできませんことを考えると:(1)あなたはVBScriptを使用できますか? (2)その出力の中に検索して置き換えることで複数の行に分割できるものがありますか。 (たとえば、>を>に、その後に改行を入れてください)
Richard

@Ramhoundその規則はどこで読みましたか? (ルールを引用)
barlop

@Ramhound他の人が行った編集を他の人が承認または却下する場合、通常はそれ以上にニュアンスがあります。彼らは非常によく受け入れられています。人々が編集を却下する理由は、人々が答えを軽視したり、答えを高支持したりする理由と同じように、微妙なものになる可能性があります。コメントのため、他の人による "#:。有効な編集と同じくらい簡単に言うことができます。質問者にとって有用であると思われるかどうかという問題です。
barlop

回答:


2

私はこれが以前に尋ねられそして答えられたと信じなければなりません。しかし、ここに仕事をすることができる簡単なバッチスクリプトがあります。

::StringCount String File
::
::  Count the number of times that String appears in File.
::  The search is not case sensitive.
::  Enclosing quotes are not considered to be part of the string.
::  The string cannot contain =
::
@echo off
setlocal disableDelayedExpansion
set count=0
for /f usebackq^ delims^=^ eol^= %%A in (%2) do set "ln=%%A"&call :testLine %1
echo %count%
exit /b

:testLine
setlocal enableDelayedExpansion
:testLine2
if defined ln if "!ln:*%~1=!" neq "!ln!" (
  set /a count+=1
  set "ln=!ln:*%~1=!"
  goto testLine2
)
endlocal & set /a count=%count%
exit /b

コマンドラインの使い方は

StringCount null yourFile.txt

これは大きなファイルではかなり遅くなる可能性があります。


私は書いた REPL.BATと呼ばれるハイブリッドJScript /バッチユーティリティ それは仕事を簡単にすることができそしてかなり速いはずです。このユーティリティは、stdinから読み込んだ行に対して正規表現検索と置換を行い、その結果をstdoutに書き込みます。このタスクを単純化するオプションを含む、かなりの数のオプションがあります。このユーティリティは、XP以降の最新のWindowsマシンで実行される純粋なスクリプトです。完全なドキュメントはスクリプトに埋め込まれています。

これはあなたの問題を解決するためにどのように使用できるかです。 大文字と小文字を区別

<yourFile.txt repl (null) \n$1\n ax | find /c "null"

検索をしたい場合 大文字小文字を区別しません

<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"

=)今、それはBATファイルでは一般的です...そうではありません。
Hannu

0

単一の実行可能ファイルをダウンロードすることができますか?

必要なのは移植性の高いものです。 grep 効用
例えばgrep(GNU grep)2.16

あなたが望むオプションは -c または --count

以下の@dbenhamのコメントのとおり、実際には 'null'の付いた行だけでなく、複数のインスタンスあたりの数を数える方法は次のとおりです。

grep -o null file-to-read.txt | grep -c 

いいえ、それはの数をカウントします それは文字列を含みます。 grep -o null someFile.txt|grep -c . うまくいくはずです。
dbenham

ああ、すみません、あなたは完全に正しいです。それでも - 私はそれを使用する方法を教えていませんでした;-)
Hannu

-1

これはあまり純粋主義的なアプローチではありません。パッケージcoreutilsとgrepでgnuwin32を入手する必要があります。

誰かが純粋なバッチでそれをすることができるならば、ある意味ですべてよりよいです。

しかし、grepとwcはWindowsでできるGNU / linuxの方法です。

copy con a.a&lt; - a.aファイルを作成します。 rrr文字列が3回あります。

C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
        1 file(s) copied.

(-o on grep -oは行全体を返さないので重要です。また、rrrが1行に何度も発生する場合は、その行に対してrrrを1回だけ表示したくないため、特に重要です。 -oは、新しい行にrrrが出現するたびに1行ずつ取得します。行の合計数は、発生の合計数になります。

C:\blah>grep -o rrr a.a
rrr
rrr
rrr

C:\blah>grep -o rrr a.a | wc -l
3

C:\blah>

ええ悲しいことに、私はサードパーティのソフトウェアをインストールすることができません。しかし助けてくれてありがとう。
user347636
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.