Eu coloquei seus dados de amostra em um arquivo chamado farmer.txt
e executei o seguinte script perl:
#! /usr/bin/perl -a -n
if (/banana/) {
@produce=grep(/banana/,split(/,/,$F[2])) ;
print join("\t",@F[0 .. 1],join(",",@produce)),"\n";
}
que produziu esta saída:
$ ./bananas.pl farmer.txt
farmer1 address1 banana-green
farmer2 address2 banana-canarvon
farmer4 address4 banana-humungous
Para cada linha na entrada que contém "banana", ela divide o terceiro campo $F[2]
por vírgulas em uma lista chamada @produce e usa a função grep()
do perl para manter apenas elementos contendo a palavra banana.
Em seguida, imprime-os no mesmo formato da entrada.
Observe que, se um agricultor produzir mais de um tipo de banana, esse script exibirá todas elas.
Aqui está uma versão do script que pode imprimir vários "frutos" (contidos em 'fruitlist.txt'):
#! /usr/bin/perl
use strict;
my $fruitlist='fruitlist.txt';
open(FRUITS,"<",$fruitlist) || die "couldn't open $fruitlist: $!\n";
while (<FRUITS>) {
chomp ;
my $fruit = $_;
print "$fruit\n---\n";
foreach my $file (@ARGV) {
open(FILE,"<",$file) || die "couldn't open $file: $!\n";
while(<FILE>) {
my @F=split(/\t/);
if (/$fruit/) {
my @produce=grep(/$fruit/,split(/,/,$F[2])) ;
print join("\t",@F[0 .. 1],join(",",@produce)),"\n";
}
}
close(FILE);
print "\n";
}
};
close(FRUITS);
Eu eliminei o modo perl -a
(awk-like) e o fiz explicitamente abrir arquivos e dividir o conteúdo no array de campo @F porque ele precisa reabrir o (s) arquivo (s) de entrada (por exemplo, agricultor. txt) várias vezes, uma vez para cada entrada em fruitlist.txt.
Se fruitlist.txt
contiver duas linhas (banana e maçã), o script
produzirá a seguinte saída:
$ ./multifruit.pl farmer.txt
banana
---
farmer1 address1 banana-green
farmer2 address2 banana-canarvon
farmer4 address4 banana-humungous
apple
---
farmer1 address1 apple1
farmer2 address2 apple-red