perl条件分割/连接

时间:2014-04-11 16:50:45

标签: arrays perl join split

我试图解析一个非常大的列表,其中某些字段为空,因此不需要行。我想要做的是确定该行在该特定字段中的空白位置并省略它。谁能帮忙?我是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错过了食物。因此,我想删除整行。我甚至不确定从哪里开始。我希望专家能为这种情况找到解决方案。

3 个答案:

答案 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

我假设行开头的数字是数据的一部分