我有这样的数据,有 6 列
LINES XY1 XY2 XY3 XY4 XY5
P1 Z/Z T/T -/- T/T T/T
P2 A/A A/A G/G Z/Z T/T
1 G/G T/T G/G T/T G/G
2 T/T A/A C/C C/C T/T
3 T/T G/G T/T G/G T/T
4 A/A C/C A/A A/A A/A
5 A/A A/A T/T T/T A/A
我想找出哪些列(从
XY1
到XY5
)对于行P1
和P2
. 相等意味着P1
和P2
包含相同的字母(等位基因)或它们中的任何一个是Z/Z
或-/-
。我将比较从行
1
到跨列到5
的列。如果它们与输出匹配,则应包含else 。我继续这个我的程序遇到第二组和行。P2
XY1
XY5
1
0
P1
P2
我将计算行的总行数,
1
以仅包括在和5
之间不同的列。P1
P2
我将通过将总和除以 和 之间不同的列数来
1
计算行的百分比。5
P1
P2
我期待这样的输出
LINES XY1 XY2 XY3 XY4 XY5
P1 eq nq eq eq eq SUM %
P2 1
1 0 0 1 0 0 0 0
2 0 1 0 0 1 1 100
3 0 0 0 0 1 0 0
4 1 0 0 0 0 0 0
5 1 1 0 0 0 1 100
我有超过 5,000 行的数据,目前我正在使用不同的公式在 Excel 2010 中工作,但这占用了我很多精力。
我想做这个 Perl,但我是 Perl 的新手。我已成功将文件读取到屏幕上。
这是我写到文件读取部分的代码。
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = 'csv.csv';
my $csv = Text::CSV->new();
open(CSV, "<", $file) or die $!;
while (<CSV>) {
if ($csv->parse($_)) {
my @columns = $csv->fields();
print "@columns\n";
}
else {
my $err = $csv->error_input;
print "Failed to parse line: $err";
}
}
close CSV;