Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl使用grep或逐行读取来匹配文件内容_Perl_File Io - Fatal编程技术网

Perl使用grep或逐行读取来匹配文件内容

Perl使用grep或逐行读取来匹配文件内容,perl,file-io,Perl,File Io,我有一个包含以下内容的文件。基于特定条件,我想提取column1数据 输入文件: RT0AC1 127.0.0.1 RT1AB1 127.0.0.1 RT2AC1 127.0.0.1 RT3AC3 127.0.0.1 ST1AC1 127.0.0.1 WA1RA1 127.0.0.1 WB1RQ1 127.0.0.1 WG3RA3 127.0.0.1 所需数据: RT0AC1 RT2AC1 RT3AC3 ST1AC1 WA1RA1 WG3RA3 这里我编写了一个Perl脚本,它可以将数据存储

我有一个包含以下内容的文件。基于特定条件,我想提取column1数据

输入文件:

RT0AC1 127.0.0.1
RT1AB1 127.0.0.1
RT2AC1 127.0.0.1
RT3AC3 127.0.0.1
ST1AC1 127.0.0.1
WA1RA1 127.0.0.1
WB1RQ1 127.0.0.1
WG3RA3 127.0.0.1
所需数据:

RT0AC1
RT2AC1
RT3AC3
ST1AC1
WA1RA1
WG3RA3
这里我编写了一个Perl脚本,它可以将数据存储在
$data
中。但无法将数据写入
out\u file.txt

#!/usr/bin/perl

use strict;
use warnings;

my $data = system('grep "AC\|RA" file.txt  | awk -F" " \'{if((substr($1,4,2) == "AC")||(substr($1,4,2) == "RA")){print $1}}\'');

print $data;

my $file = "out_file.txt";
open my $fh, ">:encoding(utf8)", $file or die "$file: $!";

print $fh $data;
close $fh;

#script continues..

out\u file.txt
的内容为空。我做错什么了吗

您是否建议我逐行阅读
file.txt
内容,并使用
regex
匹配内容,然后将内容写入
out\u file.txt
,而不是使用
grep
进行搜索

哪一个更快

编辑


这不是我脚本的结尾。我需要在脚本中做进一步的处理。因此,如果您建议使用perl one liner或
awk
,我需要按照建议的方式执行@toolic

从perl调用grep和awk是荒谬的:

#/usr/bin/env perl
严格使用;
使用警告;
使用自动模具;
我的@数据;
打开我的$fin,“:encoding(utf8)”,“out_file.txt”;
打印$fout join(“\n”,@data),“\n”;
关闭$fout;

@toolic Cool。这很有效。演出怎么样?任何建议。
perl-ne/^(\w{2}\d(AC|RA)\b/&print\'1\n\'file.txt>out\u file.txt
perl-ne/^(\S+)/&print\'1\n\'file.txt>out\u file.txt——如果您需要没有任何标准的第一列,我绝对支持glenn jackman回答中关于不使用Perl脚本调用
grep
awk
的评论,Perl脚本极有能力进行这种处理(如答案所示)。这很好地不需要正则表达式,或者你可以在正则表达式中完成这一切:
my($w,$c)=/(.{3}(AC|RA)。/;推送@data,如果$c,则推送$w
,甚至
如果(my($w)=/(.{3}(AC|RA)。/){push@data,$w}
。我想知道regex的启动成本与split相比如何,更重要的是,可读性比较如何。(不是批评,只是大声思考。)(第二种情况应该是
/(.{3}(?:AC | RA)。
。此外,根据问题说明,可能需要将最后一种
替换为
\S+
,或其他更具体的模式)@zdim您是否建议我使用
split
+
substr
+
grep
而不是问题中提到的
awk
+
grep
。由于此脚本每半小时运行一次,输入文件太长。所以我也想考虑一下脚本的性能。@vinodk89我绝对建议用Perl进行处理(而不是调用
awk
+
grep
),它在各个方面都要好得多。首先,我希望调用这些外部程序只会更慢,因为它会带来很多额外的工作。时间到了。但重要的是,这比精心制作一行调用外部工具的复杂组合要好。这是非常清楚的,错误的机会少得多,在需要时更容易更改,更可靠。。。