Hello jacobs.smith,
If you are not bothered about sequence of field 1st as per your Input_file then following may help you in same.
Code:
awk -F, 'NR==1{print "Name," $0;R=NF} NR>1{for(i=1;i<=NF;i++){A[$i,i]++;if($i){C[$i]}}} END{for(i in C){for(j=1;j<=R;j++){Q=Q?Q FS (A[i,j]=A[i,j]>=1?1:0):i FS (A[i,j]=A[i,j]>=1?1:0)};print Q;Q=""}}' Input_file
Output will be as follows.
Code:
Name,Set1,Set2,Set3
g5,0,1,1
g6,1,0,0
g7,0,1,0
g8,0,0,1
g1,1,1,1
g2,1,1,0
g3,0,0,1
g4,1,0,0
In case you need output into same order as per Input-file(sorted order) then following may help you in same.
Code:
awk -F, 'NR==1{print "Name," $0;R=NF} NR>1{for(i=1;i<=NF;i++){A[$i,i]++;if($i){C[$i]}}} END{for(i in C){for(j=1;j<=R;j++){Q=Q?Q FS (A[i,j]=A[i,j]>=1?1:0):i FS (A[i,j]=A[i,j]>=1?1:0)};print Q;Q=""}}' Input_file | sort -k1
Output will be as follows.
Code:
Name,Set1,Set2,Set3
g1,1,1,1
g2,1,1,0
g3,0,0,1
g4,1,0,0
g5,0,1,1
g6,1,0,0
g7,0,1,0
g8,0,0,1
EDIT: Adding a non-one liner form of solutions here.
Solution1:
Code:
awk -F, 'NR==1{
print "Name," $0;
R=NF
}
NR>1 {
for(i=1;i<=NF;i++){
A[$i,i]++;
if($i){
C[$i]
}
}
}
END {
for(i in C) {
for(j=1;j<=R;j++){
Q=Q?Q FS (A[i,j]=A[i,j]>=1?1:0):i FS (A[i,j]=A[i,j]>=1?1:0)};
print Q;
Q=""
}
}
' Input_file
Solution2:
Code:
awk -F, 'NR==1{
print "Name," $0;
R=NF
}
NR>1 {
for(i=1;i<=NF;i++){
A[$i,i]++;
if($i){
C[$i]
}
}
}
END {
for(i in C) {
for(j=1;j<=R;j++){
Q=Q?Q FS (A[i,j]=A[i,j]>=1?1:0):i FS (A[i,j]=A[i,j]>=1?1:0)};
print Q;
Q=""
}
}
' Input_file | sort -k1
Thanks,
R. Singh