私はしばらく作業してきたbashスクリプトを持っています。既定では、複数行にわたって重複したテキストを検索します。これが私が今まで持っているものです:
#!/bin/bash
count() {
count=$(( $3 - $2 + 1 ))
pattern=$(echo "$1" | head -n $3 | tail -n $count)
echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$"
}
file=$1
fileprep=$(grep -v '=' $file | grep -v '!' | grep -v '*' | grep -o '[[:digit:]]*' | grep . )
linecount=$(echo "$fileprep" | wc -l)
len=10
start=1
end=$(( $linecount - $len + 1 ))
for i in $(seq $start $end); do
test="$test\n$(count "$fileprep" $i $((i+len-1)))"
done
a=$(printf $test | grep -v '\b1\b' )
mostrepetitions=$(echo "$a" | sort -rn | head -n1)
for i in $(seq 1 $mostrepetitions); do
var1=$(printf "$a" | grep '\b'$i'\b' | wc -l)
var2="$var2\n$(echo $(( var1 / i )))"
done
printf "$var2" | tr '\n' '+' | awk '{print "0"$0}' | bc -l
私はこれが1〜10の数字が2回繰り返される単純なファイルでうまく機能することを知っていました(下記参照)。
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
この時点では正しく1(変数len
は10)を出力します。変数を9に変更すると、len
1-9と2-10の両方が2回以上発生する9行パターンなので、2が正しく出力されます。
ただし、ターゲットファイルで実行すると(例を見つけることができます)ここ)、不可能な結果が表示されます。
このスクリプトで見つかった9行のパターンの数は、常に10行のパターンの数の2倍以上でなければなりません。上記の1〜10を例に挙げてみましょう。そのうち1~10が唯一の10行モードだ。ところで、その中には1-9と2-10の両方が含まれていますが、両方とも2回繰り返されます。ただし、スクリプトを実行すると、10行の繰り返しパターンに対して2が出力され、9行のパターンに対しても2が出力されます。これは明らかに間違っています。なぜこれが起こるのですか?
注 -fileprep
変数は入力ファイルから数値リストを生成するために生成されます(リンクされたサンプルファイルを参照)。
答え1
あなたが説明する現象は実際には不可能ではないので、スクリプトに問題はありません。私が考えることができる最も小さな例は、len=3
相手を使用することですlen=2
。入力ファイルは次のとおりです。
1
2
1
2
1
2
を使用するとlen=3
結果が得られますが、使用する2
と疑わしいいくつかの数値はlen=2
得られませんが、再び結果を得ることができます。と同じ数の異なる繰り返しパターンを取得するには、ファイルを13行と推定するだけです。≥4
2
len=10
len=9
付録:
count()
機能を次に修正しました。
count() {
count=$(( $3 - $2 + 1 ))
pattern=$(echo "$1" | head -n $3 | tail -n $count)
occur=$(echo "$1" | pcregrep -Mc "^\Q$(echo "$pattern")\E$")
[ $occur -ge 2 ] && echo "$pattern occurs $occur times." >&2
echo $occur
}
したがって、標準エラー出力に繰り返しパターンを印刷します。 10行モードと書いています。
16
...
16
360番登場、10行パターン
16
...
16
8
2回表示されます。一方、9ラインパターンは
16
...
16
362回登場したけど
16
...
16
8
2回表示されます。ファイルには後続の行の多くのブロックが含まれています16
。私を混乱させるのは、各ブロックの9行が16
再び表示されず、合計10行の2倍しか表示されない理由です。