awk 명령을 파일에 넣기

awk 명령을 파일에 넣기

다음 호출이 있는데 명령을 파일에 bash저장하고 싶습니다 . 내가 하고 싶은 것은 특정 함수가 line 에서 시작하고 function 으로 끝나는 것입니다 . 그런 다음 함수에서 호출할 수 있습니다.awkawk$0 ~ beg_ere {display { sub(pn_ere, "") ; print }awkbash

  awk -v ukeys="$keyw" -v beg_ere="$beg_ere" -v pn_ere="$pn_ere" -v end_ere="$end_ere" \
    'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
     $0 ~ beg_ere {
       title=gensub(beg_ere, "\\2", 1, $0);
       subtitle=gensub(beg_ere, "\\3", 1, $0);
       keywords=gensub(beg_ere, "\\4", 1, $0);

       nu = split(ukeys, uaggr, ",");
       nk = split(keywords, kaggr, ",");

       display=0;
       if ( nu > 0 && nk > 0)
        {
         for (i in uaggr)
          {
            umatch=0;
            for (j in kaggr)
             {
               if (uaggr[i] == kaggr[j]) { umatch=1; break; }
             }
             if (umatch == 1) { display=1; }
          }
        }

       else if ( nu > 0 && nk == 0 )
        {
          display=0;
        }

       else if ( nu == 0 )
        {
          display=1;
        }

       if (verbiage)
        {
          print "Title: " title;
          print "Subtitle: " subtitle;
          print "Keywords: " keywords;
          print "uaggr: " praggr(uaggr);
          print "kaggr: " praggr(kaggr);
          print "nu:" nu;
          print "nk:" nk;
        }
       next
     }
     $0 ~ end_ere { display=0 ; print "" }
     display { sub(pn_ere, "") ; print }
    ' "$filename"

답변1

.awk예를 들어 확장자를 가진 새 파일을 만들고 script.awkawk 표현식을 파일에 붙여넣습니다. 그런 다음 명령에서 파일을 참조할 수 있습니다.

awk -v ukeys="$keyw" -v beg_ere="$beg_ere" -v pn_ere="$pn_ere" -v end_ere="$end_ere" -f script.awk "$filename"

답변2

awk -fand 를 둘 다 지정하는 것은 불가능하다고 생각합니다awk '{code...}' .

GNU awk(별명 gawk)에서는 옵션을 사용하여 여러 코드를 동시에 읽을 수 있습니다 -e. gawk --help자세한 내용은 참고자료를 참조하세요. 사용 방법을 읽어 보는 것도 도움이 될 것입니다 AWKPATH( man gawk관련 읽기 참조).

이 상황에서 GNU awk를 사용하지 않으려면 명령에 다중을 지정 해야 합니다 -f.awk

그리고두 개의 파일을 사용하지 마십시오당신은 그것을 사용할 수 있습니다프로세스 교체 <(command). 예를 들어 <(echo code ...)-f를 사용하여 함수를 정의하고 awk다음과 같이 파일 내부에 다른 코드를 정의할 수 있습니다.

test.awk:

{ // I'm not sure if the `{` and  `}` should be here or they're not necessary at all
 $0 ~ beg_ere {
       title=gensub(beg_ere, "\\2", 1, $0);
       subtitle=gensub(beg_ere, "\\3", 1, $0);
       keywords=gensub(beg_ere, "\\4", 1, $0);

       nu = split(ukeys, uaggr, ",");
       nk = split(keywords, kaggr, ",");

       display=0;
       if ( nu > 0 && nk > 0)
        {
         for (i in uaggr)
          {
            umatch=0;
            for (j in kaggr)
             {
               if (uaggr[i] == kaggr[j]) { umatch=1; break; }
             }
             if (umatch == 1) { display=1; }
          }
        }

       else if ( nu > 0 && nk == 0 )
        {
          display=0;
        }

       else if ( nu == 0 )
        {
          display=1;
        }

       if ()
        {
          print "Title: " title;
          print "Subtitle: " subtitle;
          print "Keywords: " keywords;
          print "uaggr: " praggr(uaggr);
          print "kaggr: " praggr(kaggr);
          print "nu:" nu;
          print "nk:" nk;
        }
       next
     }
     $0 ~ end_ere { display=0 ; print "" }
     display { sub(pn_ere, "") ; print }
}

프로세스 대체를 사용하면 다음과 같은 것을 사용할 수 있습니다.

<(echo 'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
')

또는 작은따옴표 문제를 방지하려면 '다음을 사용할 수 있습니다 cat << EOF.

<(cat <<'EOF' 
function praggr (aggr) {
  resultstr = ""
  for (k in aggr) resultstr = (resultstr " | " aggr[k])
    return resultstr
}
EOF
)

마지막으로 awk명령은 다음과 같습니다.

awk -v yourvars... -f <(echo 'function praggr (aggr) {
       resultstr = ""
       for (k in aggr) resultstr = (resultstr " | " aggr[k])
       return resultstr
     }
') -f test.awk "$filename"

관련 정보