如何在Shell中的循环中使用一对一关系定义两个变量

时间:2015-07-23 02:28:30

标签: linux shell unix for-loop awk

我有一个第三栏是

的文件
ifile.txt
2
1
4
3
5

我需要在循环中以一对一的关系分配这些值。即

for i in 20 45 50 68 90; do
if [ $i == 20 ]; then j=$(awk 'NR==1 {print $3}' ifile.txt)
if [ $i == 45 ]; then j=$(awk 'NR==2 {print $3}' ifile.txt)
if [ $i == 50 ]; then j=$(awk 'NR==3 {print $3}' ifile.txt)
if [ $i == 68 ]; then j=$(awk 'NR==4 {print $3}' ifile.txt)
if [ $i == 90 ]; then j=$(awk 'NR==5 {print $3}' ifile.txt)
fi

任何人都可以建议我采用更简单的方法。

1 个答案:

答案 0 :(得分:4)

我有时会使用这样的技术:

for code in 20/1 45/2 50/3 68/4 90/5
do
    i=${code%/*}
    j=$(awk -v line=${code#*/} 'NR == line { print $3 }' ifile.txt)
    # …use $i and $j…
    echo "i = $i, j = $j"
done

这适用于不稳定的订单或间隙等。在这种情况下,if代码的索引从1到5,因此数组也可以工作:

array=('' 20 45 50 68 90)  # Indexing from zero
for line in $(seq 1 $((${#array[@]}-1)) )
do
    i=${array[$line]}
    j=$(awk -v line=$line 'NR == line { print $3 }' ifile.txt)
    # …use $i and $j…
    echo "i = $i, j = $j"
done

给定数据文件ifile.txt

A B 2
A B 1
A B 4
A B 3
A B 5

显示的两个脚本都产生:

i = 20, j = 2
i = 45, j = 1
i = 50, j = 4
i = 68, j = 3
i = 90, j = 5