我有两种类型的制表符分隔输入文件,第一种是在第一列中垂直列出名称的矩阵,以及后续列中的数值。第二种类型的输入包含单个列,其中第一个文件类型的第一列中列出了相同名称的子集。
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文件上执行我想要的功能在目录中,AND保留输出文件的命名约定。我写了类似的程序,所以我知道
的语法system("awk ...blah blah... ");
可以并且确实可以正常工作。
我已经坚持这个问题好几天了,所以任何帮助都会非常感激!
答案 0 :(得分:0)
虽然input2有几种不同的变体,但只有 一个输入1。我有一个带有嵌入式awk命令的perl脚本 应该匹配从input2到input1的名称并打印一个 输出文件,其中包含input2和各自的名称 input1的值。
我建议<!doctype html>
<html lang="en" dir="ltr">
<head>
<script charset="utf-8" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</head>
<body>
<div class="menu_tab row">
<div class="active" rel="#tab1">Tab 1</div>
<div rel="#tab2">Tab 2</div>
<div rel="#tab3">Tab 3</div>
<div rel="#tab4">Tab 4</div>
</div>
<br/>
<div id="tab1" class="tab_content">... Tab 1 ...</div>
<div id="tab2" class="tab_content">... Tab 2 ....</div>
<div id="tab3" class="tab_content">... Tab 3 ...</div>
<div id="tab4" class="tab_content">... Tab 4 ...</div>
</body>
<script type="text/javascript">
$(document).ready(function () {
$(".tab_content").hide();
$(".tab_content:first").show();
});
$(document).on('click', ".menu_tab div", function() {
$(".menu_tab div").removeClass("active");
$(this).addClass("active");
$(".tab_content").hide();
var activeTab = $(this).attr("rel");
$(activeTab).show();
});
</script>
</html>
+ find
来实现您的目标
a comparison function
<强>参考强>
带有find的matcher(){
awk 'NR==FNR{input1record[$1]=$0;next}
$1 in input1record{print input1record[$1]}' /path/to/input1 "$@" >> /path/to/result
}
export -f matcher
find /path/to/input2_files -type f -name "input2" \
-exec bash -c 'matcher "$@"' _ {} +
构建命令行并执行subshell命令,在这种情况下我们的函数,一劳永逸。请参阅[ find ]联机帮助页。
请注意我已使用{} +
将后续运行的输出附加到输出文件。如果不希望这样,请使用>>
。
应调整>
模式以匹配所有-name
文件名