基于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


以上是基于bash或awk中的数组内容的条件打印的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>