2 个文件之间的算术生成一系列新文件(第 3 部分)

2 个文件之间的算术生成一系列新文件(第 3 部分)

我有一个制表符分隔的模型输入文件,我想针对类似于此的集成分析格式进行更改

cat input.txt
/*      Precipitation   in      mm      */
10      30      15      20      22      11

###     Species description
***     sp_name LMA     wsg     a_h     Pmass   h_max
abies_lasiocarpa        2       0.5     1       0.001   20
abies_grandis   2.5     0.4     1       0.005   30
larix_occidentalis      1.5     0.3     1       0.003   18

我有另一个从分布中随机选择的制表符分隔的乘数文件,每行 3 个,如下所示

cat multipliers.txt
2        1        3
4        3        2
3        2        3

我目前已将工作流程设置为根据 1 列乘数文件处理不同的 1 个输入参数,如上一个问题的答案所示(2 个文件之间的算术生成一系列新文件(第 2 部分))。此方法使用名为 的脚本tst.awk并使用命令运行awk -f tst.awk input.txt multipliers.txt。我想调整此脚本以根据乘法器的一个多列文件来改变多个输入。

cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    if ( tgtFldNr ) {
        lines[++numLines] = $0
    }
    else {
        hdr = hdr $0 ORS
        if ( /^\*\*\*/ ) {      # in case this line is not tab-separated
            split($0,f," ")
            for (i in f) {
                if ( f[i] == "wsg" ) {
                    tgtFldNr = i-1
                    break
                }
            }
        }
    }
    next
}
{
    mult = $1
    out = "file" FNR ".txt"
    printf "%s", hdr > out
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        $0 = lines[lineNr]
        $tgtFldNr *= mult
        print > out
    }
    close(out)
}

因此,假设我想根据 multipliers.txt 的 3 列改变输入“LMA”、“wsg”和“Pmass”,而不是当前迭代中的“wsg”,输出将如下所示

cat file1.txt

(LMA * 2、wsg * 1、Pmass * 3)

/*      Precipitation   in      mm      */
10      30      15      20      22      11

###     Species description
***     sp_name LMA     wsg     a_h     Pmass   h_max
abies_lasiocarpa        4       0.5     1       0.003   20
abies_grandis   5       0.4     1       0.015   30
larix_occidentalis      3       0.3     1       0.009   18
cat file2.txt

(LMA * 4、wsg * 3、Pmass * 2)

/*      Precipitation   in      mm      */
10      30      15      20      22      11

###     Species description
***     sp_name LMA     wsg     a_h     Pmass   h_max
abies_lasiocarpa        8       1.5     1       0.002   20
abies_grandis   10      1.2     1       0.01    30
larix_occidentalis      6       0.9     1       0.006   18
cat file3.txt

(LMA * 3、wsg * 2、Pmass * 3)

/*      Precipitation   in      mm      */
10      30      15      20      22      11

###     Species description
***     sp_name LMA     wsg     a_h     Pmass   h_max
abies_lasiocarpa        6       1       1       0.003   20
abies_grandis   7.5     0.8     1       0.015   30
larix_occidentalis      4.5     0.6     1       0.009   18

我将如何适应tst.awk这种方式?我一直在尝试将elif语句合并到 中tst.awk,但我认为我对自己正在做的事情了解不够,无法使其正常运行

答案1

awk 'BEGIN{ FS=OFS="\t" }
    NR==FNR         { muts[NR]=$0; c+=1; next }
    !hdr            { for(i=1; i<=c; i++) { close("file"i); print >>("file"i) } }
    /\*\*\*/ && !hdr{ hdr=1; next }
hdr {
      for (num in muts) {
          bak=$0; split(muts[num], tmp);
          $2*=tmp[1]; $3*=tmp[2]; $5*=tmp[3];
          close("file"num); print >>("file"num);
          $0=bak
      }
}' multipliers infile

相关内容