【发布时间】:2018-11-10 08:49:09
【问题描述】:
我想执行类似 vlookup 的过程,但有多个文件,其中所有文件的第一列的内容(按 n uniq-ed 排序)是参考值。现在我想将每个文件中的这些键值对存储在每个哈希中,然后将它们一起打印。像这样的:
file1: while(){$hash1{$key}=$val}...file2: while(){$hash2{$key}=$val}...file3: while(){$hash3{ $key}=$val}...以此类推
然后打印出来: print "$ref_val $hash1{$ref_val} $hash3{$ref_val} $hash3{$ref_val}..."
$i=1;
@FILES = @ARGV;
foreach $file(@FILES)
{
open($fh,$file);
$hname="hash".$i; ##trying to create unique hash by attaching a running number to hash name
while(<$fh>){@d=split("\t");$hname{$d[0]}=$d[7];}$i++;
}
$set=$i-1; ##store this number for recreating the hash names during printing
open(FH,"ref_list.txt");
while(<FH>)
{
chomp();print "$_\t";
## here i run the loop recreating the hash names and printing its corresponding value
for($i=1;$i<=$set;$i++){$hname="hash".$i; print "$hname{$_}\t";}
print "\n";
}
现在我被卡住了 perl 将 $hname 作为哈希名称而不是 $hash1, $hash2...
提前感谢您的帮助和意见
【问题讨论】:
-
您正在尝试使用符号引用,动态创建变量名;这只是麻烦而且(几乎)从来没有必要。为什么不简单地将这些哈希的引用放在一个数组中?
-
哈希是由第一个元素的键 (
$d[0]) 和......第八个元素的值 ($d[7]) 组成的——这是有意的吗? -
@zdim...是的,正确理解。每行有 10 列,但我需要从第 1 列(键)和第 7 列(值)中形成散列......是的,符号引用方面确实出现了,但我不确定如何在这里应用它。 .. :(
-
好的,谢谢。符号参考业务——你不想要它。只是不要这样做。现在,您的解释说“所有文件的第一列的内容(按 n uniq-ed 排序)是参考值”——这是怎么回事?所有文件中的“第一列”是一长串值,这是一个参考吗?你能展示一个样本吗?
-
好的...现在我有类似的文件:exp1.txt、exp2.txt、exp3.txt 等等。要收集和创建所有参考值的列表,我这样做:
cut -f 1 *.txt | sort | uniq > ref_list.txt