awk将file1中的行与file2中的单个记录相乘

时间:2014-03-21 20:53:23

标签: awk

我正在尝试使用 awk 将两个文件中的数据相乘。详情:

  • 数据文件有n条记录,查找文件只有1条记录。
  • 两个文件的字段数相同。分隔符是制表符。
  • 数学:(datafile_field7 * lookup_field7) - datafile_field7

给定数据文件(多个记录):

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。

2 个答案:

答案 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