如何在随机列中 grep 特定字符串

如何在随机列中 grep 特定字符串

我正在寻找从数据库中找出生产香蕉的农民及其地址。

我的数据看起来像这样:

- 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

我已经尝试过grepcutawk无法将关键详细信息打印到文本文件中,我希望该文件看起来像:

- 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”的每一行,它将第三个字段$F[2]用逗号分割成一个名为@product 的列表,并使用perl 的grep()函数仅保留包含单词banana 的元素。

然后它以与输入相同的格式打印它们。

请注意,如果农民生产不止一种香蕉,那么此脚本将显示所有香蕉。

这是可以打印多个“fruits”的脚本版本(包含在“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 字段数组中,因为它需要多次重新打开输入文件(例如 farmer.txt)一次对于 Fruitlist.txt 中的每个条目。

如果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

答案2

使用您发布的命令(抱歉我更改了cutsed我得到了下一个解决方案:

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

首先,我将空格更改为 ,以便能够使用相同的字段分隔符分隔所有字段(这样 awk 命令更容易)。之后就awk可以很好地提取香蕉了。我假设每个农民只能有一根香蕉,但您可以轻松地根据您的需要修改 awk。

相关内容