如何对结构一致的多文件中从第4列开始的隔列执行乘法运算?
我来帮你搞定这个需求!看你描述的三个文件结构,用awk就能轻松实现指定列的乘法操作,它处理这种结构化文本数据特别顺手。
解决方案:用awk实现多文件指定列的乘积计算
先明确我们要完成的核心操作:
- 保留前2列(三个文件内容完全一致,随便取哪个文件的都没问题)
- 保留所有奇数位置的列(第3、5、7...列,因为三个文件这部分内容完全相同)
- 对从第4列开始的偶数位置列(第4、6、8...72列),计算三个文件对应行该列的乘积
实现代码
把下面的代码存成multiply_cols.awk文件:
BEGIN { # 提前定义总列数72,方便后续循环遍历 total_cols = 72 } # 先将file1的所有行列数据存入数组arr1 ARGIND == 1 { for (i=1; i<=total_cols; i++) { arr1[NR,i] = $i } next } # 再将file2的所有行列数据存入数组arr2 ARGIND == 2 { for (i=1; i<=total_cols; i++) { arr2[NR,i] = $i } next } # 处理file3时,完成计算并输出最终结果 ARGIND == 3 { # 先输出前两列内容 printf "%s %s", arr1[NR,1], arr1[NR,2] # 从第3列开始遍历到最后一列 for (i=3; i<=total_cols; i++) { if (i % 2 == 1) { # 奇数列直接取file1的内容(三个文件一致) printf " %s", arr1[NR,i] } else { # 偶数列计算三个文件对应列的乘积 product = arr1[NR,i] * arr2[NR,i] * $i printf " %d", product } } # 每行结束后换行 printf "\n" }
使用方法
在终端执行以下命令即可:
awk -f multiply_cols.awk file1 file2 file3
如果不想单独存文件,也可以直接用一行命令执行:
awk 'BEGIN{total_cols=72} ARGIND==1{for(i=1;i<=total_cols;i++) arr1[NR,i]=$i; next} ARGIND==2{for(i=1;i<=total_cols;i++) arr2[NR,i]=$i; next} ARGIND==3{printf "%s %s", arr1[NR,1], arr1[NR,2]; for(i=3;i<=total_cols;i++){if(i%2==1) printf " %s", arr1[NR,i]; else {product=arr1[NR,i]*arr2[NR,i]*$i; printf " %d", product}}; printf "\n"}' file1 file2 file3
代码逻辑说明
ARGIND是awk的内置变量,用来区分当前处理的是第几个输入文件(1对应file1,2对应file2,3对应file3)- 先把前两个文件的所有数据存入数组,方便后续和file3的对应行做计算
- 遍历列时,奇数列直接输出(因为三个文件内容完全一致),偶数列则计算三个文件对应列的乘积后输出
- 用
printf保证输出格式和原文件完全一致,不会出现格式错乱
示例测试验证
拿你给出的第一行数据测试:
file1第一行:20170101 1 1 1 2 2 3 3
file2第一行:20170101 1 1 0 2 1 3 3
file3第一行:20170101 1 1 2 2 3 3 0
输出第一行会是:20170101 1 1 0 2 6 3 0——完全符合预期:第4列102=0,第6列213=6,第8列330=0,其他列均保留原样。
内容的提问来源于stack exchange,提问作者kelly
相关产品推荐
相关产品推荐

