BashやAWKにはRプログラミング言語などのIN演算子がありますか?

BashやAWKにはRプログラミング言語などのIN演算子がありますか?

Rには、特定の列に要素があることを確認するIN演算子があります。

例:果物と市場のデータフレームがある場合は、それぞれ果物名と製品を列名として使用します。たとえば、私たちは市場にどの果物があるかを確認する必要があります。

Rでは、

available_fruit <- fruits$fruit_name %in% market$products

Rの%in%に似た操作を実行するbashまたはAWK演算子はありますか?

答え1

awkオペレーターがいますin。配列のインデックスにアクセスするために使用できます(配列は連想配列/ハッシュですawk)。

果物名が配列のキーである場合は、market次のものを使用できます。

if (fruit_name in market) { ... }

文字列inがfruit_nameキーinであることを確認してくださいmarket

例えば

BEGIN { FS = "\t" }

NR == FNR { market[$1] = $2; next }

!($1 in market) { printf("No %s in the market\n", $1 ); next }

{ sum += market[$1] }

END { printf("Total sum is %.2f\n", sum ) }

2つのファイルで実行:

$ awk -f script.awk market_prices mylist

アイテムのリストmarket_pricesであるアイテムと価格を含むタブで区切られた2列ファイル。mylistスクリプトは、最初のファイルからアイテムとその価格を読み取り、そのアイテムを入力し、2番目のファイルmarket(市場に存在する場合)のアイテムの合計コストを計算し、見つからないアイテムを報告します。

このin演算子は、配列のインデックスを繰り返すためにも使用できます。

for (i in array) {
    print i, array[i]
}

インデックスの順序がソートされない可能性があります。

答え2

AwkとBashには連想配列があり、特定のエントリが存在するかどうかを見つける方法を提供します。キー/インデックス配列にあります。

まったく:

awk 'BEGIN{ a["foo"]=1; if ("foo" in a) print "yea"; }'

大きな打撃を受けた場合:

bash -c 'declare -A a=([foo]=1); if [[ ${a[foo]+x} = x ]]; then echo "yea"; fi'

(設定されている場合は空の文字列として評価され${a[foo]+x}、それ以外の場合は空の文字列として評価されます。)xa[foo]


しかし、特定の値が存在するかどうかは簡単には見つかりません。価値配列要素。はい、a[1]はいfoo。しかし、テストでは見つかりませんでした(インデックスと見つかり1ました23

awk 'BEGIN{ split("foo bar doo", a); if ("foo" in a) print "foo exists?"; }'

配列を手動で繰り返す必要があります。

awk 'BEGIN{ split("foo bar doo", a); for (i in a) if (a[i] == "foo") print "foo exists"; }'

またはBashから:

bash -c 'a=(foo bar doo); for v in "${a[@]}"; do 
         if [[ $v = "foo" ]]; then echo "foo exists"; fi; done;'

答え3

Awkでは、演算子を使用してインデックスが配列にあることを確認できますin

$ awk 'BEGIN {arr["foo"]=1; arr["bar"]=2; print "foo" in arr}'
1

それがすることは、arr[]2つの値を持つ配列を定義することですarr[foo]=1; arr[bar]=2

次に、"foo" in arrそのインデックスがfooこの配列で定義されているインデックスセットにあることを確認してください。これが真なので、print1が返されます。

これはGNU Awk ユーザーガイド → 8.1.2 配列要素リファレンス:

配列の特定のインデックスに要素が存在することを確認するには、次の式を使用します。

indx in array

関連情報