有没有办法将变量从 awk 语句传递到 bash 函数作为参数?

有没有办法将变量从 awk 语句传递到 bash 函数作为参数?

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

执行此操作的一种丑陋方法(即根据 的输出在 shell 中引发函数调用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

然而,在某些情况下这可能会严重适得其反。

相关内容