Bash循环产生不必要的重复结果

时间:2018-09-13 14:11:39

标签: bash for-loop duplicates

我正在bash中工作。我正在尝试在.txt文件的字符串中找到唯一的条形码。每个字符串可以包含3个条形码。我想识别并标记每个包含我感兴趣的条形码的独特配置。

这是我的起始reads.txt文件,其中包含我要评估的字符串。

ABCD1
EFGH2
ABGH1
EFCD2

例如,ABCD1中包含的条形码为ABCD1

我期望的结果是仅识别小数ABCD1EFGH2并将它们分别存储为result.1.txtresult.2.txt

兄弟是我的尝试。

# Add the barcode sequences to a bash array
declare -a BARCODES1=(AB EF)
declare -a BARCODES2=(CD GH)
declare -a BARCODES3=(1 2)

# Initialize counter
count=1

# Search for the barcode sequences in the reads.txt file
rm ROUND*
rm result*

for barcode in "${BARCODES1[@]}";
    do
    grep "$barcode1" reads.txt > ROUND1_MATCHES.txt

        for barcode2 in "${BARCODES2[@]}";
        do
        grep "$barcode2" ROUND1_MATCHES.txt > ROUND2_MATCHES.txt

           for barcode3 in "${BARCODES3[@]}";
            do
            grep "$barcode3" ROUND2_MATCHES.txt > ROUND3_MATCHES.txt

                if [ -s ROUND3_MATCHES.txt ]
                then
                mv ROUND3_MATCHES.txt result.$count.txt
                fi

            count=`expr $count + 1`
            done
        done
    done

奇怪的是,此代码输出了太多的结果文件。运行head results*可为我提供以下内容。

==> result.1.txt <==
ABCD1

==> result.2.txt <==
EFCD2

==> result.3.txt <==
ABGH1

==> result.4.txt <==
EFGH2

==> result.5.txt <==
ABCD1

==> result.6.txt <==
EFCD2

==> result.7.txt <==
ABGH1

==> result.8.txt <==
EFGH2

期望的结果应该是

==> result.1.txt <==
ABCD1

==> result.2.txt <==
EFCD2

1 个答案:

答案 0 :(得分:0)

您只想遍历数组的索引

for index in "${!BARCODES1[@]}"; do
    echo "${BARCODES1[index]}${BARCODES2[index]}${BARCODES3[index]}"
done
ABCD1
EFGH2

在3个嵌套循环中,count递增2 * 2 * 2 = 8次


目前还不清楚您要做什么:如果您要生成(AB,EF)和(CD,GH)与(1,2)的叉积,则可以做

$ printf "%s\n" {AB,EF}{CD,GH}{1,2}
ABCD1
ABCD2
ABGH1
ABGH2
EFCD1
EFCD2
EFGH1
EFGH2

然后,如果您尝试提取reads.txt中与这些字符串之一匹配的行,则

$ grep -xFf <( printf "%s\n" {AB,EF}{CD,GH}{1,2} ) reads.txt
ABCD1
EFGH2
ABGH1
EFCD2