在嵌套的while循环结束时打印数据[BASH]

时间:2017-09-14 01:27:24

标签: bash while-loop logic

我希望Stack可以救我...... 再次 ......

这里是代码 - 下面是我解释你如何救我的地方!

#!/bin/bash    
while IFS= read -r input <&3
    do
        if [[ "$input" =~ ^(\/path\/to\/my\/file\/)(FOO[0-9]{2}\.BAR\.[0-9]{14}\.BAZ)$ ]]
            then
                FILE="${BASH_REMATCH[2]}"
            else
                echo "Unknown Input!"
                exit 1
        fi
        printf "\n\n%s" "Reading input ($FILE) now ... "
        while IFS= read -r line
        if [[ "$line" =~ ^(V22200)(.*)$ ]] #Version 2.2
            then
                if [[ "$VERSION" = "2.2" ]] && [[ "$COLUMN082" =~ ^(PP)([A-Z0-9]{3})([0-9]{6})$ ]]
                    then
                        if [[ "${BASH_REMATCH[2]}" = "FOO" ]]
                            then
                                OUTPUT_PATH="/path/to/my/file/${FILE}_${BASH_REMATCH[2]}_${VERSION}${EXT}"
                                if [[ ! -f "/path/to/my/file//${FILE}_${BASH_REMATCH[2]}_${VERSION}${EXT}" ]]
                                    then
                                        HEADERS='1'
                                fi
                        fi
                        if [[ "$HEADERS" -eq '1' ]]
                            then
                                printf '%s\n' "337 column headers go here" > "${OUTPUT_PATH}"
                        fi
                        HEADERS='0'
                        if [[ "$VERSION" = "2.2" ]] && [[ "$COLUMN082" =~ ^(PP)([A-Z0-9]{3})([0-9]{6})$ ]] && [[ ! -z "$OUTPUT_PATH" ]] && [[ "$COLUMN031" -eq '0' ]]
                            then
                                printf '%s\n' "$COLUMN001,...,$COLUMN337" >> "$OUTPUT_PATH"
                        fi
                fi
            COLUMN014=$(echo "$line" | cut -b7 | tr -d '[:space:]')
            COLUMN015=$(echo "$line" | cut -b8-17 | tr -d '[:space:]')
            COLUMN016=$(echo "$line" | cut -b18 | tr -d '[:space:]')
            COLUMN017=$(echo "$line" | cut -b19 | tr -d '[:space:]')
            COLUMN018=$(echo "$line" | cut -b20-21 | tr -d '[:space:]')
            COLUMN019=$(echo "$line" | cut -b22-23 | tr -d '[:space:]')
            COLUMN020=$(echo "$line" | cut -b24 | tr -d '[:space:]')
            COLUMN021=$(echo "$line" | cut -b25-26 | tr -d '[:space:]')
            COLUMN022=$(echo "$line" | cut -b27 | tr -d '[:space:]')
            COLUMN023=$(echo "$line" | cut -b28-37 | tr -d '[:space:]')
            COLUMN024=$(echo "$line" | cut -b38-43 | tr -d '[:space:]')
            COLUMN025=$(echo "$line" | cut -b44-58 | tr -d '[:space:]')
            COLUMN026=$(echo "$line" | cut -b59-62 | tr -d '[:space:]')
            COLUMN027=$(echo "$line" | cut -b63-74 | tr -d '[:space:]')
            COLUMN028=$(echo "$line" | cut -b75-80 | tr -d '[:space:]')
            COLUMN029=$(echo "$line" | cut -b81-84 | tr -d '[:space:]')
            COLUMN030=$(echo "$line" | cut -b85-88 | tr -d '[:space:]')
            COLUMN031=$(echo "$line" | cut -b89-90 | tr -d '[:space:]')
            COLUMN032=$(echo "$line" | cut -b91-96 | tr -d '[:space:]')
            COLUMN033=$(echo "$line" | cut -b97-115 | tr -d '[:space:]')
            COLUMN034=$(echo "$line" | cut -b116-127 | tr -d '[:space:]')
        fi
    done < "${input}"
    printf "%s\n" "done!"
    mv "$input" /my/path/to/the/Processed_Files
done 3</path/to/my/results.txt

这是我所做的非常截断的版本,但我希望它足以传达我的问题。我有两个while循环嵌套。结果文件由find在目录中搜索与正则表达式模式匹配的文件生成。然后将这些结果存储在results.txt中,并将该文件输入文件描述符3&#34;然后将其分配给变量&#34; $ input&#34;。 &#34; $输入&#34;然后在另一个while read循环中逐行读取。

我希望你能看到,当我到达某一行(V22200)时,我需要打印所有337列的值。我这样做,很好,我们到达终点,它再次循环。问题是当涉及到文件的最后一个块时。由于print语句不是我做的最后一件事,在退出之前,我在最后一个块中的值被分配给它们所属的任何列变量,但是因为我们在最后,所以没有需要再次循环,并且print语句永远不会将最后一个块写入文件,这使得它有效地丢弃了数据。

我想简单的答案就是将我的print语句向下移动,但这样做会覆盖我在COLUMN014-COLUMN034中的值(来自上面的例子)......

我已经阅读了很多关于检测EOF或不打印最后一行的内容,或者在循环结束时发生的其他奇怪事情 - 我不认为这是我的问题。我看到一个答案表明我写了#34; $ line&#34;变量然后在echo语句之后done变量,但我在每次传递时都需要打印337个值...所以这对我来说似乎不可行。

我感谢您对如何编写我的最后一个块所提出的任何支持或建议,因为循环结束并且打印命令永远不会出现。

P.S。 - 是的,我知道我的缩进不是传统的,或者甚至是正确的,但它只是我学习它的方式。遗憾。

0 个答案:

没有答案