基于bash或awk中的数组内容的条件打印
我有一个包含以下内容的输入文件:
SS SC
a 1
b 2
d 5
f 7
我有一个输入 bash 数组如下:
echo "${input[*]}"
a b c d e f
我需要创建一个输出:
1. 在第一列中打印数组的所有元素
2. 在第二列中,我需要根据元素的存在打印 0 或 1。
为了解释这一点,在名为 的输入数组中input,我有a,b,c,d,e,f. Nowa存在于输入文件中,所以输出应该是a 1,而c在输入文件中缺少,所以输出应该c 0在输出中。
例如:预期结果:
SS RESULT
a 1
b 1
c 0
d 1
e 0
f 1
尝试split对 bash 数组进行迭代,以尝试对其进行迭代,但是每行打印(awk 的工作方式),它变得太难以处理了。awk -v par="${input[*]}" 'BEGIN{ n = split(par, a, " ")} {for(i=0;i<=n;i++){printf "%sn ", a[i]}}' 输入
我能够(缺少标题)用bashfor 循环和一些来做到这一点grep:但希望awk会更短,因为我需要把它放在一个yaml文件中,所以需要保持简短。
for item in ${input[@]};do
if ! grep -qE "^${item}" input ;then
echo "$item 0";
else
echo "$item 1";
fi;
done
a 1
b 1
c 0
d 1
e 0
f 1
回答
使用awk到在该文件的第一列中的值存储在关联数组,然后查看是否在它的阵列存在的元素:
#!/usr/bin/env bash
input=(a b c d e f)
awk 'BEGIN { print "SS", "RESULT" }
FNR == NR { vals[$1] = 1; next }
{ print $0, $0 in vals }
' input.txt <(printf "%sn" "${input[@]}")
或者在 pure 中做同样的事情bash:
#!/usr/bin/env bash
input=(a b c d e f)
declare -A vals
while read -r v _; do
vals[$v]=1
done < input.txt
echo "SS RESULT"
for v in "${input[@]}"; do
if [[ -v vals[$v] ]]; then
printf "%s 1n" "$v"
else
printf "%s 0n" "$v"
fi
done