我正在寻找从数据库中找出生产香蕉的农民及其地址。
我的数据看起来像这样:
- 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”的每一行,它将第三个字段$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
使用您发布的命令(抱歉我更改了cut
)sed
我得到了下一个解决方案:
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。