如何将多个文件中的每个其他列相乘

时间:2018-03-26 03:53:40

标签: awk

所有

我有三个这样的文件:file1 file2 file3,它们具有相同数量的行和列。每个文件包含72列(前两列相同,第(2n + 1)列也相同),如

文件1

20170101 1 1 1 2 2 3 3...  
20170101 2 1 2 2 4 3 4...
20170101 3 1 5 2 3 3 6 ...

file2的

20170101 1 1 0 2 1 3 3...  
20170101 2 1 2 2 4 3 2...
20170101 3 1 3 2 4 3 1 ..

file3的

20170101 1 1 2 2 3 3 0...  
20170101 2 1 1 2 4 3 2...
20170101 3 1 4 2 4 3 0 ..

从第4列开始,我想将每个其他列相乘,例如col4,col6,col8,col10 ...输出应为

20170101 1 1 0 2 6 3 0...  
20170101 2 1 4 2 64 3 16...
20170101 3 1 60 2 48 3 0 ..

我尝试了这个,但是从col4开始的所有列都会相乘。

paste file1 file2 file3| awk '{ for(i=3;i<=NF/2; i++) printf("%4.2E ", $i*$(i+NF/2)*$(i+NF))); printf("\n"); }'

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

假设所有输入文件的行数相同:

$ awk '{getline a < "f2"; getline b < "f3"; split(a,s1); split(b,s2)}
       {for(i=4;i<=NF;i+=2) $i*=s1[i]*s2[i]; print}' f1
20170101 1 1 0 2 6 3 0
20170101 2 1 4 2 64 3 16
20170101 3 1 60 2 48 3 0
  • getline a < "f2"从file2获取一行,保存在变量a
  • split(a,s1)拆分a中的内容(与默认输入行拆分相同)并保存在变量s1
  • for(i=4;i<=NF;i+=2) $i*=s1[i]*s2[i]需要操作
  • print打印已修改的输入行 - 如果需要,请使用格式
  • 有关getline警告的信息,请参阅AllAboutGetline

答案 1 :(得分:0)

由于您使用public sendSMS(): void { this.contactsList.forEach(contact => { console.log(contact.number); // WORKING!!!! }) //this.deviceProvider.sendSMS(this.contactsList, this.message); } 命令,我将在我的回答中使用它,否则我真的建议使用Sundeep的解决方案paste

以下粘贴命令将交错3个文件:

getline

您可以在输出此输出后使用$ paste -d '\n' file1 file2 file3 20170101 1 1 1 2 2 3 3 20170101 1 1 0 2 1 3 3 20170101 1 1 2 2 3 3 0 20170101 2 1 2 2 4 3 4 20170101 2 1 2 2 4 3 2 20170101 2 1 1 2 4 3 2 20170101 3 1 5 2 3 3 6 20170101 3 1 3 2 4 3 1 20170101 3 1 4 2 4 3 0 来生成您需要的输出:

awk

<强>说明:

$ paste -d '\n' file1 file2 file3 | awk '{for(i=4;i<=NF;i+=2)if(NR>1){a[i]*=$i;}else{a[i]=$i}if(NR%3==0){printf $1 OFS $2 OFS; for(i in a){printf $(i-1) OFS a[i] OFS;a[i]=1}printf ORS;}}'
20170101 1 1 0 2 6 3 0 
20170101 2 1 4 2 64 3 16 
20170101 3 1 60 2 48 3 0