2016-04-19 11 views
-2

大きなテキストファイルのサブ文字列の数をチェックする非常に小さなプログラムを作成しようとしています。テキストファイルの最初の2000行を数え、 "TTT"サブストリングを見つけて数え、その合計に変数をセットするだけです。私はシェルに少し新しく、どんな助けも驚くほど高く評価されるでしょう!ファイル内の文字列の数を確認する

awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename 

これは、区切り文字「TTT」により、ファイル内の各レコードを分割します:それはあなたがawkこのタスクに適しかもしれない価値がある何のため

#!/bin/bash 

$counter=(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 
+2

動作しませんか?あなたは実際に質問をしませんでした。 –

+0

これは構文エラーです。それが明確でない場合はごめんなさい – Frost

+0

'$ counter ='の代わりに 'counter ='を使用する必要があります。最初の 'grep TTT'はスキップすることができます。 –

答えて

0

。次に、フィールドの数を数え、1を減算して合計に加算します。

のようなファイル:

4 
2 
1 
2 

は1を引い:レコードごとのフィールド数を数える

| || something 
1 5 | 
tt 
one more | record 

ttt tttttt something 
1 5 ttt 
tt 
one more ttt record 

は以下のように(パイプでdelimで可視化)に分割されるだろうそこから:

3 
1 
0 
1 

合計が5つで、これは "ttt"部分文字列の数です。スクリプトにこれを組み込む(そして、あなたの他の問題を修正)する

#!/bin/bash 

counter=$(awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename) 
echo $counter 

ここでの変化は、私たちがバッシュに変数を設定するとき、我々は前に$記号が含まれていないということです。変数を参照する場合にのみ、$が含まれます。

+1

ワンステップをさらに進めるのはどうですか? 'awk -v RS =" ttt "'END {print NR-1}' file' – karakfa

+0

これはとても素晴らしいです! – JNevill

0

あなたはおそらく、あなたがこの意味、そこにいくつかのマイナーな構文エラーがあります。

counter=$(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 

は注意してください、私はそれを動作させるためにそこに作られた小さな変更を。途中で

ところでgrep TTTが冗長である、あなたは、単にそれをドロップすることができ、それは次のようになります。

counter=$(head -2000 [file name] | grep -o TTT | wc -l) 
0

grepが、すでにあなたがやりたいことができます:counter=$(grep -c TTT $infile)。ヒット数(行ではない)を-m NUM, --max-count=NUMに制限すると、ファイルの末尾にgrepを停止させるか、またはNUM個のオカレンスが見つかったときにgrepを停止させることができます。

関連する問題