【问题标题】:Conditional print based on array content in bash or awk基于 bash 或 awk 中的数组内容的条件打印
【发布时间】:2021-07-22 23:36:53
【问题描述】:

我有一个包含以下内容的输入文件:

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。现在a出现在输入文件中,所以输出应该是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

我能够(缺少标题)使用bash for 循环和一些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

【问题讨论】:

    标签: bash awk sed


    【解决方案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 "%s\n" "${input[@]}")
    

    或者用纯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 1\n" "$v"
        else
            printf "%s 0\n" "$v"
        fi
    done
    

    【讨论】:

      【解决方案2】:

      下面的代码sn-p演示了如何在perl中实现

      use strict;
      use warnings;
      use feature 'say';
      
      my @array = qw/a b c d e f/;
      my %seen;
      
      $seen{(split)[0]}++ while <DATA>;
      
      say 'SS RESULT';
      say $_, ' ', $seen{$_} ? 1 : 0 for @array;
      
      __DATA__
      SS SC
      a 1
      b 2
      d 5
      f 7
      

      输出

      SS RESULT
      a 1
      b 1
      c 0
      d 1
      e 0
      f 1
      

      【讨论】:

        猜你喜欢
        • 2019-07-14
        • 1970-01-01
        • 2016-11-11
        • 2013-01-27
        • 2020-06-22
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        相关资源
        最近更新 更多