我是一名数据科学家,并且正在使用一个文本文件,该文件通过在每个数据集的新行上打印参与者的ID来指定特定参与者的我有多少个数据集。第二列计算的是不同参与者的数量,
a 1
1
1
b 2
b 2
c 3
d 4
d 4
d 4
我现在需要创建一个矩阵,该矩阵的每个参与者都有一列,并通过将值指定为1 vs 0来指定引用该参与者的行。我有2000多个参与者,因此我无法手动或手写列出所有列号以及在何处打印内容,但必须创建规则。
文件中的列数将是第2 + 2列的最后一行的数字(在示例中应为4 + 2 = 6)。基本上,对于每一行,我需要在与(第2列中的值(参与者编号)+ 2)匹配的列中打印1。对于该行,所有其他列的值为0。因此,对于第1行,列(1 + 2 =)3的值为1,所有其他列的值为0。对于第2行,列(1 + 2 =) 3等于1,所有其他列的值为0,依此类推。
这应该看起来像这样:
a 1 1 0 0 0
a 1 1 0 0 0
a 1 1 0 0 0
b 2 0 1 0 0
b 2 0 1 0 0
c 3 0 0 1 0
d 4 0 0 0 1
d 4 0 0 0 1
d 4 0 0 0 1
我希望我能提供我尝试过的代码,但是我不知道从哪里开始。
希望任何人都可以提供帮助。谢谢!
答案 0 :(得分:1)
awk
来营救!
$ awk 'NR==FNR{if(max<$2)max=$2; next}
{printf "%s %s", $1,$2;
for(i=1;i<=max;i++) printf " %s", i==$2;
print ""}' file{,}
a 1 1 0 0 0
a 1 1 0 0 0
a 1 1 0 0 0
b 2 0 1 0 0
b 2 0 1 0 0
c 3 0 0 1 0
d 4 0 0 0 1
d 4 0 0 0 1
d 4 0 0 0 1
使用这种双重扫描算法,一致性和顺序无关紧要。