能否使用awk实现行与列对应元素的乘法运算?附输入输出示例
当然可以用awk实现这个乘法运算需求!
先帮你理清楚对应的运算逻辑:
你的输入序列是0 1 2 3 2 1 3,对应到你提到的变量:
- A12 = 输入第2个元素(1),A13 = 输入第3个元素(2),A14 = 输入第4个元素(3)
- A21 = 输入第5个元素(2),需要计算
A21*A12、A21*A13、A21*A14→ 21=2,22=4,2*3=6 - A31 = 输入第6个元素(1),计算
A31*A12、A31*A13、A31*A14→11=1,12=2,1*3=3 - A41 = 输入第7个元素(3),计算
A41*A12、A41*A13、A41*A14→31=3,32=6,3*3=9
接下来把这些计算结果按你需要的顺序拼接,就能得到期望的输出。下面是实现这个逻辑的awk脚本:
{ # 把输入的每个元素存入数组,索引从1开始对应位置 arr[1] = $1; arr[2] = $2; arr[3] = $3; arr[4] = $4; arr[5] = $5; arr[6] = $6; arr[7] = $7; # 提取A1系列的固定值 A12 = arr[2]; A13 = arr[3]; A14 = arr[4]; # 计算各组乘积 # A21相关乘积 p21_12 = arr[5] * A12; p21_13 = arr[5] * A13; p21_14 = arr[5] * A14; # A31相关乘积 p31_12 = arr[6] * A12; p31_13 = arr[6] * A13; p31_14 = arr[6] * A14; # A41相关乘积 p41_12 = arr[7] * A12; p41_13 = arr[7] * A13; p41_14 = arr[7] * A14; # 按要求的顺序输出所有元素,用空格分隔 printf "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", arr[1], arr[2], arr[3], arr[4], arr[5], p21_12, p21_13, p21_14, arr[6], p31_12, p31_13, p31_14, arr[7], p41_12, p41_13, p41_14; }
运行方式
把上面的代码保存为calc.awk,然后用管道传入输入数据:
echo "0 1 2 3 2 1 3" | awk -f calc.awk
或者直接用单行命令运行:
echo "0 1 2 3 2 1 3" | awk '{arr[1]=$1;arr[2]=$2;arr[3]=$3;arr[4]=$4;arr[5]=$5;arr[6]=$6;arr[7]=$7;A12=arr[2];A13=arr[3];A14=arr[4];p21_12=arr[5]*A12;p21_13=arr[5]*A13;p21_14=arr[5]*A14;p31_12=arr[6]*A12;p31_13=arr[6]*A13;p31_14=arr[6]*A14;p41_12=arr[7]*A12;p41_13=arr[7]*A13;p41_14=arr[7]*A14;printf "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",arr[1],arr[2],arr[3],arr[4],arr[5],p21_12,p21_13,p21_14,arr[6],p31_12,p31_13,p31_14,arr[7],p41_12,p41_13,p41_14}'
运行后就能得到你期望的输出:
0 1 2 3 2 2 4 6 1 1 2 3 3 3 6 9
如果后续输入的结构有调整(比如变量对应位置变化),只需要修改数组索引和输出的顺序即可,灵活性很强。
内容的提问来源于stack exchange,提问作者T.ALC
相关产品推荐
相关产品推荐

