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