awk
bash 스크립트의 명령문을 사용하여 텍스트 파일(예: 1 또는 4 및 2 또는 3)에서 특정 값을 찾으려고 합니다. 값이 파일(명령문 내)에서 발견되면 awk
명령문 외부에서 함수를 호출 awk
하고 찾은 값을 매개변수로 전달하고 싶습니다.
내 질문: (1) 이것이 가능합니까? 그렇다면 어떨까요? (2) 불가능하거나 더 좋은 방법이 있으면 어떻게 합니까?
파일을 검색할 때 텍스트 파일의 처음 두 줄을 건너뛰었습니다. 저는 GNU AWK를 사용하고 있습니다. 추가 설명이 필요하면 알려주시기 바랍니다.
**교차 게시에 대해 미리 사과드리며, 원하는 답변을 얻지 못하고 있습니다.
파일.txt
Name Col1 Col2 Col3
-----------------------
row1 1 4 7
row2 2 5 8
row3 3 6 9
실제 retrieve
기능은 이 단순화된 예보다 훨씬 더 복잡합니다. 따라서 이 함수를 명령문에 넣고 싶지 않기 때문에 이 함수를 호출해야 합니다 awk
.
function retrieve {
if [[ "$1" == "1" ]]; then
echo "one beer on the wall"
elif [[ "$1" == "4" ]]; then
echo "four beers on the wall"
fi
}
function retrieve2 {
if [[ "$1" == "2" ]]; then
echo "two beers on the wall"
elif [[ "$1" == "3" ]]; then
echo "three beers on the wall"
fi
}
awk -F '\t' '
FNR < 2 {next}
FNR == NR {
for (i=2; i <= NF; i++)
{
if (($i == 1) || ($i == 4))
printf(%s, "'retrieve "$i" '") # Here is the problem
if (($i == 2) || ($i == 2))
printf(%s, "'retrieve2 "$i" '") # Here is the problem
}
}
' file.txt
답변1
이를 수행하는 추악한 방법(예: 의 출력을 기반으로 셸에서 함수 호출을 트리거하는 것 awk
)은 다음과 같습니다.
awk -F '\t' '
FNR < 2 {next}
FNR == NR {
for (i=2; i <= NF; i++) {
if (($i == 1) || ($i == 4))
printf "retrieve %s\n", $i
if (($i == 2) || ($i == 2))
printf "retrieve2 %s\n", $i
}
}
' file.txt | while read l; do eval $l; done
그러나 어떤 경우에는 이것이 심하게 역효과를 낳을 수 있습니다.