awk
bashスクリプトのステートメントを使用して、テキストファイル(たとえば、1、4、2、3など)で特定の値を見つけようとします。値がファイル(コマンドステートメント内)で見つかった場合は、awk
ステートメントの外部で関数を呼び出し、awk
見つかった値をパラメータとして渡したいと思います。
私の質問:(1)これは可能ですか?それではどうでしょうか? (2) 不可能またはより良い方法がある場合はどうすればよいですか?
ファイルを検索すると、テキストファイルの最初の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
しかし、場合によっては、これがひどく悪影響を及ぼす可能性があります。