Bash
過濾序列數組以刪除具有移位序列的重複項的問題
我在進行一系列列表比較以刪除重複項時遇到了一些麻煩。我的數組由三元值序列組成,如下所示:
{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循環在下標testsequence.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 甚至更多。這就是為什麼我想保留我的下標來比較數組的兩行。
這是一個 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