任意の列で特定の文字列を見つける方法

任意の列で特定の文字列を見つける方法

私はデータベースを通してバナナを生産する農家と彼らの住所を見つけようとしています。

私のデータは次のとおりです。

- 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

試してgrepみましたが、主要な詳細をテキストファイルとして印刷できませんでした。ファイルをcut次のawkように作成したいと思います。

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

誰でも助けることができますか?


そのため、Casのスクリプト(Casに感謝します!)を使用した後、必要な情報を抽出できました。完璧だった!ただし、必要な情報のリストを含むテキストファイルがあり、リスト全体(約400項目)に対してこのプロセスを繰り返したいと思います。リストを処理するためにスクリプトを変更しようとしましたが、間違っています。 「実行」されているように見えますが、何も印刷しません。

#! /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";
        }
}
  • 私の「農家リスト」はVARFILEにあります。
  • 私の「フルーツリスト」はGENEFILEにあります。
  • TEST.TXTに戻り値を印刷したいです。

ベストアンサー1

サンプルデータをというファイルに入れて、次のfarmer.txtPerlスクリプトを実行しました。

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

if (/banana/) {
  @produce=grep(/banana/,split(/,/,$F[2])) ;
  print join("\t",@F[0 .. 1],join(",",@produce)),"\n";
}

次の出力が生成されました。

$ ./bananas.pl farmer.txt
farmer1 address1    banana-green
farmer2 address2    banana-canarvon
farmer4 address4    banana-humungous

入力に「banana」を含む各行に対して、3番目のフィールドを$F[2]@productというリストでカンマで区切り、perlgrep()関数を使用してバナナという単語を含む要素のみを保持します。

次に、入力と同じ形式で印刷します。

農家が複数の種類のバナナを生産している場合、このスクリプトはすべてのバナナを表示します。

以下は、複数の「フルーツ」(「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);

私はperl -a(awkに似た)モードを放棄し、ファイルを明示的に開き、内容を@ Fフィールド配列に分割しました。これは、Fruitlistの入力ファイル(farmer.txtなど)を複数回再開する必要があるためです。各項目の.txt。

2つの行(バナナとリンゴ)が含まれている場合、fruitlist.txtスクリプトは次の出力を生成します。

$ ./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

おすすめ記事