중복 항목을 제거하기 위해 목록 배열 비교를 수행하는 데 문제가 있습니다. 내 배열은 다음과 같은 일련의 삼항 값으로 구성됩니다.
{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}
두 시퀀스가 동일한지 식별하는 Mathematica 스크립트 래퍼인 subscript testequence.sh의 도움으로 while 루프를 사용하여 중복 항목을 찾으려고 합니다.
{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
이것은 'input'이라는 파일의 입력을 배열로 읽은 다음 input
해당 배열을 반복하고 해당 특정 시퀀스가 이전에 표시되었는지 테스트하여 아직 표시되지 않은 경우 값을 인쇄하는 bash 루프입니다. . 그런 다음 시퀀스를 13개 위치 모두로 회전하고 알려진 회전의 연관 배열에 값을 추가합니다. 쉘 루프를 사용하고 필요에 따라 입력 또는 출력을 조정할 수 있는 방법을 보여주기 위해 데이터를 단순화했습니다.
#!/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