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}
、それ以外の場合は空の文字列として評価されます。)x
a[foo]
しかし、特定の値が存在するかどうかは簡単には見つかりません。価値配列要素。はい、a[1]
はいfoo
。しかし、テストでは見つかりませんでした(インデックスと見つかり1
ました2
)3
。
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
この配列で定義されているインデックスセットにあることを確認してください。これが真なので、print
1が返されます。
これはGNU Awk ユーザーガイド → 8.1.2 配列要素リファレンス:
配列の特定のインデックスに要素が存在することを確認するには、次の式を使用します。
indx in array