linux - 如何在 Shell 的循环中定义两个具有一对一关系的变量

标签 linux shell unix for-loop awk

我有一个文件,它的第 3 列是

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

谁能建议我一个更简单的方法。

最佳答案

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

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

关于linux - 如何在 Shell 的循环中定义两个具有一对一关系的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31577197/

相关文章:

linux - 如何合并不同服务器上的目录?

Bash:将命令输出和时间戳附加到文件

bash - 无法在 shell 脚本中运行 ssh

java - Git:重构文件名后无法清理工作副本

c++ - 如何在Linux中获取mmap()函数的FileDescriptor的内存地址,对于Video4Linux

linux - sincos() 堆栈溢出问题,解决方案?

c++ - 控制台 shell 的 boost 类

shell - 获取发送到电子邮件的回显 cron 文本

c - readdir_r 进入长文件名的无限循环

Linux内核源代码修改和重新编译