我正在尝试使用 awk 将两个文件中的数据相乘。详情:
给定数据文件(多个记录):
Col1 Col2 Col3 Col4 Col5 Col6a 100 200 300 400 500 600
Col1 Col2 Col3 Col4 Col5 Col6b 150 250 350 450 550 650
Col1 Col2 Col3 Col4 Col5 Col6c 20 30 40 50 60 70
给定lookupfile(仅限1条记录):
Col1 Col2 Col3 Col4 Col5 Col6 2.2 4 3 5 4 6
输出:
Col1 Col2 Col3 Col4 Col5 Col6a 120 600 600 1600 1500 3000
Col1 Col2 Col3 Col4 Col5 Col6b 180 750 700 1800 1650 3250
Col1 Col2 Col3 Col4 Col5 Col6c 24 90 80 200 180 350
@JayPal为上面的问题提供了一个完美的解决方案(使用制表符分隔格式化):
"BEGIN{FS=OFS=\"\t\"} NR==FNR{for(i=7;i<=NF;i++)fld[i]=$i;next}{for(i=7;i<=NF;i++)$i=($i*fld[i])-$i FS}1"
我试图从几个例子中收集并看看如何使用像
这样的矩阵数学FNR==NR{a[FNR]=$0}
{
for(i=1;i<=NF;i++)
{
print($i*a[FNR])
}
printf(\"\n\")
}
lookup.txt data.txt >output.txt
坚持两件事:限制到field7 +并从查找文件中仅拉出record1。
答案 0 :(得分:1)
这应该有效:
awk 'NR==FNR{for(i=7;i<=NF;i++)fld[i]=$i;next}{for(i=7;i<=NF;i++)$i=($i*fld[i])-$i}1' lookupfile datafile
<强>输出:强>
$ awk 'NR==FNR{for(i=7;i<=NF;i++)fld[i]=$i;next}{for(i=7;i<=NF;i++)$i=($i*fld[i])-$i}1' loo mul
Col1 Col2 Col3 Col4 Col5 Col6a 120 600 600 1600 1500 3000
Col1 Col2 Col3 Col4 Col5 Col6b 180 750 700 1800 1650 3250
Col1 Col2 Col3 Col4 Col5 Col6c 24 90 80 200 180 350
答案 1 :(得分:0)
注意到d * f - d = d * (f-1)
,我们有
awk '
NR==FNR {for (i=7; i<=NF; i++) f[i]=$i-1; next}
{for (i=7; i<=NF; i++) $i *= f[i]}
1
' lookupfile datafile