【发布时间】:2020-05-14 08:36:23
【问题描述】:
我有一个包含以下内容的文件。根据特定条件,我想提取 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_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 one liner 或 awk 我需要按照建议的方式执行 @toolic 。
【问题讨论】:
-
@toolic 酷。这样可行。性能怎么样?任何建议。
-
perl -ne "/^(\w{2}\d(AC|RA)\d)\b/ && print \"$1\n\"" file.txt > out_file.txt -
perl -ne "/^(\S+)/ && print \"$1\n\"" file.txt > out_file.txt-- 如果您需要没有任何条件的第一列。 -
我绝对支持 glenn-jackman 的回答中关于不从 Perl 脚本中调用
grep和awk的评论,该脚本非常有能力进行这种处理(如答案所示)。