java 执行 awk_在perl脚本中编写awk命令

这篇博客讲述了如何在Perl脚本中使用awk命令处理两种不同格式的制表符分隔输入文件。目标是匹配input2中的名称并在input1中找到相应的数值,生成一个输出文件,展示匹配的名称及其在input1中的数值。作者提供了代码示例,但遇到了在脚本中执行awk命令的问题。尽管该命令在命令行中可以正常工作,但在Perl脚本中却无法执行。作者寻求帮助以解决这个问题。
摘要由CSDN通过智能技术生成

我有两种类型的制表符分隔输入文件,第一种是在第一列中垂直列出名称的矩阵,以及后续列中的数值 . 第二种类型的输入包含单个列,其中第一个文件类型的第一列中列出了相同名称的子集 .

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... ");

可以而且确实有效 .

我已经坚持这个问题好几天了,所以任何帮助都会非常感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值