我试图解析一个非常大的列表,其中某些字段为空,因此不需要行。我想要做的是确定该行在该特定字段中的空白位置并省略它。谁能帮忙?我是perl的新手,我不确定是否应该使用split,join或者其中之一。
id name food drink
1 joe chips pop
2 jack chicken beer
3 josh pizza beer
4 jim beer
5 john cookies milk
这是一个\t
分隔的示例表。请注意,#4 Jim错过了食物。因此,我想删除整行。我甚至不确定从哪里开始。我希望专家能为这种情况找到解决方案。
答案 0 :(得分:2)
好的,不做一个班轮......
split接受一个字符串并将其拆分,因此每个项都是我返回的数组中的一个元素。 join
走另一条路。它允许我将数组的元素连接成一个字符串。
请注意,我使用/\s+/
进行分割。这可以匹配任何连续的空格,并且可以使用单个选项卡,或者如果一个人输入两个选项卡以使事情看起来不错,或者如果有人在按Tab键之前意外键入一两个空格。
您希望确保所有线条都有四个元素。由于我们将行拆分为数组,因此我们可以测试以确保该行的数组中包含四个元素。如果没有,我们可以跳过它。
要测试数组中有多少元素,只需在标量上下文中使用该数组。我的比较next if @array < 4;
正在这样做。 next
将跳转到循环的下一次迭代,而不通过其余的循环代码。您通常会在Perl中看到next if...
或next unless
类型语句。这是跳过不符合条件的文件或数组中的线条的好方法。
__DATA__
在Perl中是一个巧妙的技巧。 __DATA__
之后的所有行都被视为文件。当我访问<DATA>
时,就像我从文件中读取一样。
use strict;
use warnings;
use autodie;
use feature qw(say);
for my $line ( <DATA> ) {
chomp $line; # Always "chomp" right after a read
my @array = split /\s+/, $line;
next if (@array < 4 );
printf "%-2.2s %-10.10s %-10.10s %-10.10s\n", @array;
}
__DATA__
id name food drink
1 joe chips pop
2 jack chicken beer
3 josh pizza beer
4 jim beer
5 john cookies milk
这将打印出来:
id name food drink
1 joe chips pop
2 jack chicken beer
3 josh pizza beer
5 john cookies milk
答案 1 :(得分:1)
它将跳过至少有一个空值的行
perl -F'\t' -wane 'print if !grep !length, @F' file
# or
# perl -F'\t' -wane 'print unless grep !length, @F' file
输出
1 joe chips pop
2 jack chicken beer
3 josh pizza beer
5 john cookies milk
或只是检查第三栏,
perl -F'\t' -wane 'print if length($F[2])' file
答案 2 :(得分:1)
使用autosplit和命令行程序非常简单。喜欢这个
perl -aF\t -ne "print if $F[3] =~ /\S/" milk.txt
<强>输出强>
1 joe chips pop
2 jack chicken beer
3 josh pizza beer
5 john cookies milk
我假设行开头的数字是数据的一部分