计算同时包含 0 和 1 的列数

计算同时包含 0 和 1 的列数

我有一个包含 0、1 和 -9 的表。

-9  -9  0   1   1
-9  1   0   0   0
0   -9  0   1   -9
-9  -9  1   0   -9
-9  -9  0   0   0

我想知道有多少列同时具有 0 和 1。在示例中,答案是 3。

我正在考虑合并awkprint打印“true”,以防该列同时包含 0 和 1(否则打印 false)。

然后我必须| grep true | wc -l计算列的数量。

这听起来是一个很好的解决方案吗?或者我该如何做到这一点awk

答案1

ruby 非常适合处理数组数组:

ruby -e '
    rows = File.readlines( ARGV.shift ).map {|line| line.split}
    columns = rows.transpose
    puts columns.count {|column| column.include?("0") and column.include?("1")}
' file

或者,没有变量

ruby -e 'puts readlines
                .map {|line| line.split}
                .transpose
                .count {|column| column.include?("0") and column.include?("1")}
' file

答案2

尝试(这个丑陋的)

awk '{if ( NF>maxi) maxi =NF ; 
       for(i=1;i<=NF;i++) {if ( $i == 0 ) zero[i]=1 ; 
               if ($i ==1 ) one[i]=1 ;}}
     END { for (i=1;i<=maxi;i++) if ( zero[i]+one[i]==2) print i ;}' file

这基本上为每一列设置了一个0标志1。两者之和必须为 2。

答案3

使用BSD rs

<file rs -T | grep -w 0 | grep -wc 1

在哪里:

  • rs -T转置矩阵
  • grep -w 0选择包含 0 作为单个w排序的行(以前称为列)
  • grep -wc 11计算包含单个单词的剩余行数(最初为列数)

但请注意forgrep -w是由数字或下划线组成的序列,因此 while1不会在 中找到,但如果as既不是数字也不是下划线,10则会找到。-1-

如果-1在输入中可能出现,您可能需要将其更改为:

<file rs -T | sed 's/.*/ & /' | grep ' 0 ' | grep -c ' 1 '

答案4

Awk解决方案:

awk '{ for (i=1; i<=NF; i++) a[i] = (NR > 1? a[i] : "") $i; }
     END{ 
         for (i in a) if (a[i] ~ /(0.*1|1.*0)/) c++;
         print c 
     }' file

输出:

3

相关内容