다음과 유사한 통합 분석 형식으로 변경하려는 탭으로 구분된 모델 입력 파일이 있습니다.
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부)). 이 방법은 이라는 스크립트를 사용 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)
}
따라서 현재 반복에서 "wsg" 대신 multipliers.txt의 3개 열을 기반으로 입력 "LMA", "wsg" 및 "Pmass"를 변경한다고 가정하면 출력은 다음과 같습니다.
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