我有一个包含以下内容的文件。根据特定条件,我想提取第1列数据。
输入文件:
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_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_file.txt
的内容为空。我做错了什么吗?
您是否建议我逐行读取file.txt
内容并使用regex
匹配内容并将内容写入out_file.txt
而不是使用 grep
进行搜索。
哪一个会更快?
编辑:
这不是我的剧本的结尾。我需要在我的脚本中做进一步的处理。因此,如果您建议 perl oneliner 或 awk,我需要按照建议的方式执行@toolic。
最佳答案
从 perl 调用 grep 和 awk 是没有意义的:
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
my @data;
open my $fin, "<:encoding(utf8)", "file.txt";
while (<$fin>) {
my $word = (split)[0];
my $code = substr($word, 3, 2);
push @data, $word if grep {$_ eq $code} qw(AC RA);
}
close $fin;
open my $fout, ">:encoding(utf8)", "out_file.txt";
print $fout join("\n", @data), "\n";
close $fout;
关于Perl 使用 grep 匹配文件内容或逐行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61782099/