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

标签 perl file-io

我有一个包含以下内容的文件。根据特定条件,我想提取第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/

相关文章:

c++ - 将数据写入文件的 'best' 方法是什么,稍后再次读入。

perl - 我应该如何处理来自同一字符串中不同 UNICODE 数字集的数字?

java - 将 Xml 文件导入 java 应用程序

mysql - 递归遍历 DBIx::Class 关系

MacOS:两个 Perl 安装: "Dumper.c: loadable library and perl binaries are mismatched"

php - PHP中的delete()和unlink()有什么区别

c - 我对 read() 和 write() 做错了什么?

c 使用结构指针数组写入和读取文件

regex - 替换大文件中带引号的字符串中的换行符

perl - '->to()' 可以在 Mojolicious::Lite 中使用吗?