所有
我有三个这样的文件: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"); }'
感谢您的帮助。
答案 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
打印已修改的输入行 - 如果需要,请使用格式答案 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