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
然而,在某些情况下这可能会严重适得其反。