在 R 中,我们有 IN 运算符来检查元素是否存在于特定列中。
例如:如果我们有水果和市场数据框,分别以fruit_name和products作为列名。比如说,我们必须检查市场上有哪些水果。
在 R 中,
available_fruit <- fruits$fruit_name %in% market$products
bash 或 AWK 中是否有任何运算符可以执行与 R 中的 %in% 类似的操作?
答案1
awk
有一个in
操作员。它可用于访问数组中的索引(数组是关联数组/散列awk
)。
如果水果的名称是数组中的键,market
那么您可以使用
if (fruit_name in market) { ... }
检查 in 中的字符串是否fruit_name
是 中的键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 ) }
在两个文件上运行:
$ awk -f script.awk market_prices mylist
其中market_prices
是包含商品和价格的两列制表符分隔文件,mylist
是商品列表。该脚本将从第一个文件中读取商品及其价格并填充market
这些商品,然后计算第二个文件中商品的总成本(如果它们存在于市场中),并报告无法找到的商品。
该in
运算符还可以用于循环数组的索引:
for (i in array) {
print i, array[i]
}
索引的顺序可能未排序。
答案2
Awk 和 Bash 具有关联数组,它们确实提供了一种查找特定内容是否存在的方法。键/索引是在数组中。
在 awk 中:
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[]
具有两个值的数组:arr[foo]=1; arr[bar]=2
。
然后,"foo" in arr
检查索引是否foo
位于该数组中定义的索引集中。由于这是真的,因此print
返回 1。
这在GNU Awk 用户指南 → 8.1.2 引用数组元素:
要确定某个元素是否存在于数组中的某个索引处,请使用以下表达式:
indx in array