私はデータベースを通してバナナを生産する農家と彼らの住所を見つけようとしています。
私のデータは次のとおりです。
- 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.txt
Perlスクリプトを実行しました。
#! /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