我希望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。 - 是的,我知道我的缩进不是传统的,或者甚至是正确的,但它只是我学习它的方式。遗憾。