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입니다.

열에 0과 1이 모두 포함된 경우(그렇지 않으면 false를 인쇄) 병합하여 "true"를 인쇄하려고 awk합니다 .print

| 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 00을 포함하는 행(이전의 열)을 단일 w정렬 로 선택
  • grep -wc 11단일 단어를 포함하는 나머지 행 수(초기에는 열 수)를 계산합니다.

하지만 참고하세요성격for grep -w는 일련의 숫자 또는 밑줄이므로 while은 1찾을 수 없지만 10as가 숫자도 밑줄도 아닌 경우에는 찾을 수 있습니다.-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

관련 정보