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 0
0을 포함하는 행(이전의 열)을 단일w
정렬 로 선택grep -wc 1
1
단일 단어를 포함하는 나머지 행 수(초기에는 열 수)를 계산합니다.
하지만 참고하세요성격for grep -w
는 일련의 숫자 또는 밑줄이므로 while은 1
찾을 수 없지만 10
as가 숫자도 밑줄도 아닌 경우에는 찾을 수 있습니다.-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