![awk 명령을 파일에 넣기](https://linux55.com/image/216631/awk%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%84%A3%EA%B8%B0.png)
다음 호출이 있는데 명령을 파일에 bash
저장하고 싶습니다 . 내가 하고 싶은 것은 특정 함수가 line 에서 시작하고 function 으로 끝나는 것입니다 . 그런 다음 함수에서 호출할 수 있습니다.awk
awk
$0 ~ beg_ere {
display { sub(pn_ere, "") ; print }
awk
bash
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.awk
awk 표현식을 파일에 붙여넣습니다. 그런 다음 명령에서 파일을 참조할 수 있습니다.
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 -f
and 를 둘 다 지정하는 것은 불가능하다고 생각합니다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"