For循环不是每行读取它
For loop not reading it per line
尝试循环包含(见下文)但不是每行每行单独获取的文件。
7b.01.10 0 0.00 0.00 .... . 0.00 .... .
3c.00.2 0 0.00 0.00 .... . 0.00 .... .
7b.01.0 0 40.18 40.18 1.00 134 0.00 .... .
3c.00.3 0 35.65 35.65 1.00 135 0.00 .... .
7b.01.1 0 28.30 28.30 1.00 133 0.00 .... .
3c.00.4 0 44.71 44.71 1.00 133 0.00 .... .
7b.01.2 0 32.82 32.82 1.00 131 0.00 .... .
3c.00.5 0 40.75 40.75 1.00 134 0.00 .... .
7b.01.3 0 37.92 37.92 1.00 137 0.00 .... .
3c.00.6 0 32.82 32.82 1.00 133 0.00 .... .
7b.01.4 0 30.56 30.56 1.00 138 0.00 .... .
我要处理的是每行中的值。
比如第一行.
F1=7b.01.10
F2=0
F3=0.00
F4=0.00
F5=....
F6=.
F7=0.00
F8=....
F9=.
原因是我将在循环中将每个变量用于另一个 if 语句。 Ex: ans=F1*F4
for i in `cat file.txt`; do
F1=`echo "${i}" | awk '{ print }'`
F2=`echo "${i}" | awk '{ print }'`
F3=`echo "${i}" | awk '{ print }'`
F4=`echo "${i}" | awk '{ print }'`
F5=`echo "${i}" | awk '{ print }'`
F6=`echo "${i}" | awk '{ print }'`
echo "$F1 $F2 $F3 $F4 $F5 $F6 "
done
知道我错过了什么吗?
您可能想要使用 read
while read line; do
echo $line
done < file.txt
这应该逐行打印文件。所以,现在,您可以对每一行施展魔法了。
#!/bin/bash
input="data.txt"
while IFS= read -r line
do
read -ra array <<< "$line"
F1="${array[0]}"
F2="${array[1]}"
F3="${array[2]}"
F4="${array[3]}"
F5="${array[4]}"
F6="${array[5]}"
echo "$F1 $F2 $F3 $F4 $F5 $F6 "
done < "$input"
此 Shellcheck-clean 代码处理文本数据文件的常见问题:
#! /bin/bash -p
inputfile='data.txt'
while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 || [[ -n $f1 ]]; do
printf '%s\n' "$f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9"
done < "$inputfile"
|| [[ -n $f1 ]]
是为了支持最后一行没有终止换行符的数据文件。这样的文件很常见。参见 BashFAQ/001 - My text files are broken! They lack their final newlines!。
- 有关我将变量名称转换为小写的原因的解释,请参阅 Correct Bash and shell script variable capitalization。
- 请参阅对 Why is printf better than echo? 的公认且优秀的回答,以了解我为何使用
printf
而不是 echo
。
尝试循环包含(见下文)但不是每行每行单独获取的文件。
7b.01.10 0 0.00 0.00 .... . 0.00 .... .
3c.00.2 0 0.00 0.00 .... . 0.00 .... .
7b.01.0 0 40.18 40.18 1.00 134 0.00 .... .
3c.00.3 0 35.65 35.65 1.00 135 0.00 .... .
7b.01.1 0 28.30 28.30 1.00 133 0.00 .... .
3c.00.4 0 44.71 44.71 1.00 133 0.00 .... .
7b.01.2 0 32.82 32.82 1.00 131 0.00 .... .
3c.00.5 0 40.75 40.75 1.00 134 0.00 .... .
7b.01.3 0 37.92 37.92 1.00 137 0.00 .... .
3c.00.6 0 32.82 32.82 1.00 133 0.00 .... .
7b.01.4 0 30.56 30.56 1.00 138 0.00 .... .
我要处理的是每行中的值。 比如第一行.
F1=7b.01.10
F2=0
F3=0.00
F4=0.00
F5=....
F6=.
F7=0.00
F8=....
F9=.
原因是我将在循环中将每个变量用于另一个 if 语句。 Ex: ans=F1*F4
for i in `cat file.txt`; do
F1=`echo "${i}" | awk '{ print }'`
F2=`echo "${i}" | awk '{ print }'`
F3=`echo "${i}" | awk '{ print }'`
F4=`echo "${i}" | awk '{ print }'`
F5=`echo "${i}" | awk '{ print }'`
F6=`echo "${i}" | awk '{ print }'`
echo "$F1 $F2 $F3 $F4 $F5 $F6 "
done
知道我错过了什么吗?
您可能想要使用 read
while read line; do
echo $line
done < file.txt
这应该逐行打印文件。所以,现在,您可以对每一行施展魔法了。
#!/bin/bash
input="data.txt"
while IFS= read -r line
do
read -ra array <<< "$line"
F1="${array[0]}"
F2="${array[1]}"
F3="${array[2]}"
F4="${array[3]}"
F5="${array[4]}"
F6="${array[5]}"
echo "$F1 $F2 $F3 $F4 $F5 $F6 "
done < "$input"
此 Shellcheck-clean 代码处理文本数据文件的常见问题:
#! /bin/bash -p
inputfile='data.txt'
while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 || [[ -n $f1 ]]; do
printf '%s\n' "$f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9"
done < "$inputfile"
|| [[ -n $f1 ]]
是为了支持最后一行没有终止换行符的数据文件。这样的文件很常见。参见 BashFAQ/001 - My text files are broken! They lack their final newlines!。- 有关我将变量名称转换为小写的原因的解释,请参阅 Correct Bash and shell script variable capitalization。
- 请参阅对 Why is printf better than echo? 的公认且优秀的回答,以了解我为何使用
printf
而不是echo
。