我有一个我已经研究了一段时间的 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 重复了两次(像这样):
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
在此,它将正确输出 1(len
变量为 10)。当len
变量变为9时,它会正确输出2,因为1-9和2-10都是至少出现两次的9个线型。
但是,当我在我的目标文件上运行它时(可以在此处找到一个示例),我得到了不可能的结果。
在此脚本中,找到的九行模式的数量必须始终至少是十行模式数量的两倍。以上面的1-10为例。其中,1-10 是唯一的十行模式。但是,其中有 1-9 和 2-10,两者都重复了两次。但是,当我运行我的脚本时,对于十行重复模式,我得到 2 的输出,而对于九行模式,我也得到 2 的输出。这显然是不正确的。为什么会这样?
注意 -fileprep
创建变量是为了从输入文件中创建一个数字列表(请参阅我链接的示例文件)。
您描述的现象实际上并非不可能,因此您的脚本不是问题。我能想到的最小的例子是 with
len=3
而不是len=2
,输入文件是使用
len=3
,您会得到结果2
,但是使用len=2
,您不会得到一些≥4
您可能会怀疑的数字,而是再次得到结果2
。为了获得与 和 相同数量的不同重复模式len=10
,len=9
您只需将文件外推到 13 行。附录:
我将
count()
功能修改为所以它打印重复到标准错误输出的模式。它说 10 行模式
出现 360 次,而 10 线模式
出现两次。另一方面,9线模式
出现 362 次,而
出现两次。您的文件包含许多带有
16
. 令我困惑的是,为什么16
每个这样的块都不会再出现 9 行,而是总共 10 行的两倍多。