Text-Processing

生成一系列新文件的 2 個文件之間的算術 (Pt 3)

  • March 16, 2021

我有一個製表符分隔的模型輸入文件,我想改變一個與此類似的集成分析

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 個文件之間的算術生成一系列新文件 (Pt 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中,但我認為我對我正在做什麼以使其正常執行的了解不夠

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

引用自:https://unix.stackexchange.com/questions/639595