我有一个包含 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。
我正在考虑合并awk
并print
打印“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 1
1
计算包含单个单词的剩余行数(最初为列数)
但请注意字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