![使用“for”循环将每一行视为输入,连续逐行读取文件](https://linux22.com/image/119246/%E4%BD%BF%E7%94%A8%E2%80%9Cfor%E2%80%9D%E5%BE%AA%E7%8E%AF%E5%B0%86%E6%AF%8F%E4%B8%80%E8%A1%8C%E8%A7%86%E4%B8%BA%E8%BE%93%E5%85%A5%EF%BC%8C%E8%BF%9E%E7%BB%AD%E9%80%90%E8%A1%8C%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6.png)
考虑具有以下值的 file.txt 文件
one,two
three,four
five,six
six,seven
red,tree
需要 shell 脚本命令来执行以下活动
- For 循环,其中循环应连续执行,执行的行数与 file.txt 的行数相同
- 在每个循环执行中,相应的行应被视为执行的输入。
例如,在第一个循环执行中,“one”应存储在一个变量中,“two”应存储在另一个变量中,以便在执行时使用变量值
Input1="one"
Input2="two"
与第二行执行类似,“三”应存储在一个变量中,“四”应存储在另一个变量中,如下所示
Input1="three"
Input2="four"
答案1
while IFS=, read -r input1 input2; do
# do stuff with "$input1" and "$input2"
done <file.txt
为该命令设置IFS
逗号read
将使其以逗号分隔每个输入行。该行的两个字段将被读入input1
和input2
。
如果任何行上的字段多于两个,则“剩余”数据将被放入input2
.
根据您想要对数据执行的操作,这可能是也可能不是一个好主意。看为什么使用 shell 循环处理文本被认为是不好的做法?
您会注意到这awk
对于解析这样的数据特别有用,而不需要循环:
$ awk -F, '{ printf("Line %d:\n\tField 1 = %s\n\tField 2 = %s\n", NR, $1, $2) }' file.txt
Line 1:
Field 1 = one
Field 2 = two
Line 2:
Field 1 = three
Field 2 = four
Line 3:
Field 1 = five
Field 2 = six
Line 4:
Field 1 = six
Field 2 = seven
Line 5:
Field 1 = red
Field 2 = tree
答案2
目前尚不清楚你在问什么。为什么每次迭代都需要整个文件。
你需要这个吗?
while IFS=, read -r Input1 Input2; do
# do something with the variables
echo "1=$Input1 2=$Input2"
done < file.txt