我有两种类型的制表符分隔输入文件,第一种是在第一列中垂直列出名称的矩阵,以及后续列中的数值 . 第二种类型的输入包含单个列,其中第一个文件类型的第一列中列出了相同名称的子集 .
EX:input1
Gary 1 2 3
Yolanda 3 4 5
Biff 5 6 7
Hubert 8 9 10
EX:input2
Gary
Biff
虽然input2有几种不同的变体,但只有一个输入1 . 我有一个带有嵌入式awk命令的perl脚本,该命令应该匹配input2和input1中的名称,并打印一个输出文件,其中包含input2中的名称和input1中的相应值 .
EX:outputfile
Gary 1 2 3
Biff 5 6 7
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
my $dir1 = '../FeatureSelection/Chunks/ArffPreprocessing';
my $dir2 = '../DataFiles';
opendir(DIR, $dir1) or die $!;
while (my $file = readdir(DIR)) {
# We only want files
next unless (-f "$dir1/$file");
# Use a regular expression to find files with .txt
next unless ($file =~ m/\.txt/);
my @partialName = (split /\./, $file);
#The $matchingFile is the file which contains attributes listed vertically, along side their respective data
my $matchingFile = "$dir2/input1\.txt ";
system("awk -F\"\t\" 'FILENAME==\"$dir1/$file\"{a[\$1]=\$1} FILENAME==\"$matchingFile\"{if(a[\$1]){print \$0}}' $dir1/$file $matchingFile > $dir1/$partialName[0]'\_matched.out' ");
}
closedir(DIR);
exit 0;
这是在命令行上工作的行,但它拒绝在我的perl脚本中工作 .
awk -F"\t" 'FILENAME=="input2.txt"{a[$1]=$1} FILENAME=="../../../DataFiles/input1.txt"{if(a[$1]){print $0}}' input2.txt ../../../DataFiles/input1.txt > input2_matched.out
顺便说一句,input2文件的绝对数量使命令propt上面的awk行的硬编码真的很痛苦,这就是为什么我使用了一个perl脚本,它可以在目录中的每个input2文件上执行我想要的功能,并保留输出文件的命名约定 . 我写过类似的程序,所以我知道它的语法
system("awk ...blah blah... ");
可以而且确实有效 .
我已经坚持这个问题好几天了,所以任何帮助都会非常感激!