Perl使用grep或逐行读取来匹配文件内容
我有一个包含以下内容的文件。基于特定条件,我想提取column1数据 输入文件: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脚本,它可以将数据存储
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
),它在各个方面都要好得多。首先,我希望调用这些外部程序只会更慢,因为它会带来很多额外的工作。时间到了。但重要的是,这比精心制作一行调用外部工具的复杂组合要好。这是非常清楚的,错误的机会少得多,在需要时更容易更改,更可靠。。。