como grep string específica na coluna aleatória

2

Estou procurando descobrir qualquer agricultor que produz bananas e seu endereço de um banco de dados.

Meus dados são parecidos com isto:

- farmer1 address1 apple1,banana-green,orange-5  
- farmer2 address2 orange-unriped6,apple-red,banana-canarvon,peach-sweet 
- farmer3 address3 peach-blacklisted,orange-ok,lime-unriped 
- farmer4 address4 banana-humungous,orange-meh,watermelon-amazing,vegetables-fresh

Eu tentei grep , cut e awk , mas não consigo imprimir apenas os detalhes principais em um arquivo de texto que espero ser algo como:

- farmer1 address1 banana-green
- farmer2 address2 banana-canarvon
- farmer4 address4 banana-humongous

Alguém pode ajudar por favor?

Então, depois de usar o script do Cas (obrigado, Cas!), eu sou capaz de extrair as informações que eu preciso - o que é perfeito! No entanto, eu tenho um arquivo de texto contendo uma lista de informações que eu preciso e espero repetir este processo para toda a lista (cerca de 400 itens). Eu tentei modificar o script para lidar com uma lista, mas estou fazendo algo errado. Parece "funcionar", mas nada está imprimindo.

#! /usr/bin/perl -a -n

open( GENEFILE, "ActinGenesENST.txt") or die "$!";
open( VARFILE, "Actin.ENSTvars.txt") or die "$!";
open( OUTPUTFILE, "test.txt") or die "!";
print "Extracting Genes\n";
while (<GENEFILE>) {
        if (/VARFILE/) {
        @produce=grep(/VARFILE/,split(/,/,$F[9])) ;
        print OUTPUTFILE join("\t",@F[0 .. 8],join(",",@produce)),"\n";
        }
}
  • Minha "lista de fazendeiros" está em VARFILE.
  • Minha "lista de frutas" está em GENEFILE.
  • Desejo imprimir os valores retornados em TEST.TXT.
por royston 01.10.2015 / 08:50

2 respostas

1

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
    
por 01.10.2015 / 10:03
0

Usando os comandos que você postou (desculpe, eu mudei cut para sed ) eu obtive a próxima solução:

cat your_file|sed 's/ /,/g'|awk -F, '{for (i=1;i<=NF;i++) {if (index(tolower($i),"banana")) {print $1,$2,$i}}}'

Primeiro eu mudei espaços para, para poder ter todos os campos separados com o mesmo separador de campo (o comando awk é mais fácil assim). Depois disso awk faz um bom trabalho extraindo suas bananas. Eu presumi que só poderia haver uma banana por agricultor, mas você pode facilmente modificar o awk de acordo com suas necessidades.

    
por 01.10.2015 / 10:20

Tags