我有两个包含多列的 txt 文件。这是第一个文件 ( $frequency
) 的样子:
C1 C2 A a B b C c D d
text 1 0 1 0 0 0 0 0 0
text 2 1 0 5 4 0 0 0 0
text 3 0 0 0 0 10 11 3 6
text 4 1 0 9 4 0 2 0 0
text 5 5 3 0 0 6 7 4 0
所以 C2 包含从 1 到 20000 的所有位置。Ad 列包含所有等于或大于 0 的数值。
这是第二个文件 ( $variants
) 的样子
C1 C2 C3 C4
text 2 A D
text 4 B C
text 5 A B,D
这里的 C2 包含 1 到 20000 之间的一些值。C3 和 C4 包含 AD 之间的字母(如表 1 中的列名,但都是大写字母)。我现在要做的是:将 C2 from$variants
中的值与C2 from 中的值匹配$frequency
,然后检查 C3 中的哪个字母$variants
,然后复制相应的值(因此正确的行和正确的大写字母和小写字母列)从$frequency
到 中的两个新列$variants
。然后需要对 的 C4 执行相同的操作$variants
。
编辑:有时 C4 in 也可能$variants
包含两个由“,”分隔的字母。对于这两个字母,来自的值$frequency
应该出现在输出中
这就是输出的样子,基于这个例子
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
text 2 A D 1 0 0 0 empty
text 4 B C 9 4 0 2 empty
text 5 A B,D 5 3 0 0 4 0
我已经开始使用脚本,但我被困在某个需要比较值和字母的地方。
这是我到目前为止所拥有的:
my $table1 = prompt("Give the name of the file with variants:\n");
open(my $variants, '<',$table1) || die "Could not open file $table1 $!";
my $table2 = prompt("Give the name of the file with the frequencies: \n");
open(my $frequency, '<',$table2) || die "Could not open file $table2 $!";
my (@position, @A, @a, @B, @b, @C, @c, @D, @d); #instead of using hashes I was trying to put all the values in arrays, because I don't know how to hash multiple columns from a file.
while(<$frequency>){
my @column = split(/\t/); # split on tabs
$position[$_] .= "$column[1] "; # I want to assign the correct column values to the arrays
$Afor[$_] .= "$column[2] ";
$arev[$_] .= "$column[3] ";
$Bfor[$_] .= "$column[4] ";
$brev[$_] .= "$column[5] ";
$Cfor[$_] .= "$column[6] ";
$crev[$_] .= "$column[7] ";
$Dfor[$_] .= "$column[8] ";
$drev[$_] .= "$column[9] ";
}
while(<$variants>){
next if /^\s*#/; # skipping some lines
next if /^\s*"/;
chomp;
my ($chr, $pos, $refall, $altall) = split;
}
我不确定这是否是正确的方法,因为我现在无法弄清楚如何检查正确的行和$frequencies
. 有人可以帮我吗?