分类: LINUX
2015-07-30 16:08:07
需求:
有2个文件,文件中是2个相同的矩阵,比如:
file1:
2 3 4
2 3 4
2 3 4
file2:
1 1 2
1 1 3
1 1 4
需要的结果是输出:
3 4 6
3 4 7
3 4 8
方法一:
分析:
从结果看,这个题目要求的是将2个矩阵相加,对应的位置都要相加,这个问题实现的方法很多,这里我们通常的做法是将2个文件对应的位置的值取出来,再相加,如果用二维数组实现很简单,开始想的很简单,仔细一想,发现实现起来其实也是很简单,主要实现方法:
1.先将2个文件内容按照行的方式读取到数组,使用awk的多文件处理的NR/FNR来进行转换
2.在将对应的位置内容分别读取出来,进行加法运算,将运算结果打印出来
实现的shell:
#!/bin/sh #author by bbzsxjj #定义2个文件 file1=file1 file2=file2 awk '{if(NR==FNR){a[FNR]=$0};if(NR!=FNR){b[FNR]=$0}} END{for(i=1;i<=length(a);i++){ split(a[i],c," ");split(b[i],d," "); e="";for(j=1;j<=length(c);j++){e=e" "(c[j]+d[j])} ;print e } }' $file1 $file2 说明: split(a[i],c," ");split(b[i],d," "); 将每行的数进行切割,转换为数组,便于后续的处理 此脚本适用于 2个一样规格的矩阵相加,不适用于行列不对称的矩阵运算 |
#!/bin/sh file1=file1 file2=file2 linenum=1 while read line do a1=(`echo $line`) a2=(`sed -n ''${linenum}'p' $file2`) linenum=$((linenum+1)) b="" for((i=0;i<${#a1[*]};i++)) do b=$b" "$((a1[$i]+a2[$i])) done echo $b done<$file1 |
方法三:
使用python写这个脚本:
#!/usr/bin/env python file1='1.txt' file2='2.txt' fp1=open(file1,'r') fp2=open(file2,'r') def create_matrix(fp): matrix=[] for line in fp: mx=line.split() matrix.append(mx) return matrix def matrix_add(mx1,mx2): matrix=[] for i in range(len(mx1)): ma=[] for j in range(len(mx1)): k=int(mx1[i][j])+int(mx2[i][j]) ma.append(k) matrix.append(ma) return matrix matrix1=create_matrix(fp1) matrix2=create_matrix(fp2) print matrix1 print matrix2 matrix3=matrix_add(matrix1,matrix2) print matrix3 |
#!/usr/bin/env python file1='1.txt' file2='2.txt' fp1=open(file1,'r') fp2=open(file2,'r') def create_matrix(fp): matrix=[] for line in fp: mx=line.split() matrix.append(mx) return matrix def matrix_add(mx1,mx2,mx3): for i in range(len(mx1)): for j in range(len(mx1)): mx3[i][j]=int(mx1[i][j])+int(mx2[i][j]) return mx3 matrix1=create_matrix(fp1) matrix2=create_matrix(fp2) matrix3=matrix2 print matrix1 print matrix2 matrix=matrix_add(matrix1,matrix2,matrix3) print matrix |