![过滤序列数组以删除移位序列的重复项的问题](https://linux22.com/image/97832/%E8%BF%87%E6%BB%A4%E5%BA%8F%E5%88%97%E6%95%B0%E7%BB%84%E4%BB%A5%E5%88%A0%E9%99%A4%E7%A7%BB%E4%BD%8D%E5%BA%8F%E5%88%97%E7%9A%84%E9%87%8D%E5%A4%8D%E9%A1%B9%E7%9A%84%E9%97%AE%E9%A2%98.png)
我在进行列表数组比较以删除重复项时遇到了一些麻烦。我的数组由三元值序列组成,如下所示:
{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}
{0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2}
{0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0}
{0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1}
{0, 1, 2, 1, 0, 0, 1, 0, 1, 1, 1, 2, 2}
{0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2, 0}
{0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2, 1, 1}
{0, 2, 2, 2, 1, 1, 0, 2, 1, 2, 0, 0, 2}
{1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2}
{1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0}
{1, 0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2, 1}
{1, 1, 0, 2, 1, 2, 0, 0, 2, 0, 2, 2, 2}
{1, 1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0}
{1, 1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0, 1}
{1, 2, 0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2}
{1, 2, 1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 0}
{1, 2, 2, 0, 1, 2, 1, 0, 0, 1, 0, 1, 1}
{2, 0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1}
我尝试使用 while 循环在下标 testequence.sh 的帮助下查找重复项,这是一个 Mathematica 脚本包装器,用于识别两个序列是否相同:
{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}
{0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 0}
这两个是一样的,只是左移;在这种情况下,我的下标返回 1,并且下标的使用方式如下:
./testsequence.sh "`echo ${foundsequence[0]}`" "`echo ${foundsequence[1]}`"
我第一次尝试使用 while 循环,仅将第一个序列与其他序列进行比较,仅删除一半的重复项。
好的结果一定是:
{0, 0, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1}
{0, 0, 2, 0, 2, 2, 2, 1, 1, 0, 2, 1, 2}
因为它们是列表中唯一的两个独特序列。
请注意,数组中的序列不是固定长度的。它们的长度可以从 2 到 121 甚至更长。这就是为什么我想保留下标来比较数组的两行。
答案1
这是一个 bash 循环,它将输入从名为 'input' 的文件读取到名为 的数组中input
,然后循环该数组并测试以查看之前是否见过该特定序列;如果还没有看到,则打印该值。然后,它将该序列旋转到所有 13 个位置,并将这些值添加到已知旋转关联数组中。我简化了数据以展示该方法;您可以使用 shell 循环并根据需要调整输入或输出。
#!/usr/bin/env bash
readarray -t input < input
declare -A rotations
for((i=0; i < ${#input[*]}; i++))
do
x=${input[i]}
[[ ${rotations[$x]:-0} -eq 0 ]] && printf "%s\n" "$x"
for((r=0; r < 13; r++))
do
new=${x:r}${x:0:r}
rotations[$new]=1
done
done
示例输入数据(从问题复制,然后简化):
0010111220121
0020222110212
0101112201210
0111220121001
0121001011122
0202221102120
0212002022211
0222110212002
1001011122012
1011122012100
1021200202221
1102120020222
1112201210010
1122012100101
1200202221102
1210010111220
1220121001011
2002022211021
示例输出:
0010111220121
0020222110212