일련의 새 파일을 생성하기 위한 두 파일 간의 산술(3부)

일련의 새 파일을 생성하기 위한 두 파일 간의 산술(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부)). 이 방법은 이라는 스크립트를 사용 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

관련 정보