Text-Processing
生成一系列新文件的 2 個文件之間的算術 (Pt 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 個文件之間的算術生成一系列新文件 (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