如何从文件中抓住一对单词



我想在file2行中找到file1的单词。这些单词都被两个文件中的空格隔开。我想要两条条目,订单无关紧要,对于文件中的第二行,这对可以是STG00001 STG00009和STG00009 STG00001,等等。此外,File2中任何单词对的多次发生也可以。

这是我的列表file_1,带有一对单词

STG00001 STG00001
STG00001 STG00009
STG00001 STG00012
STG00001 STG00010
STG00001 STG00011

这是file_2,要解析的文件

SML_00001 STG01479 STG00226 RSJ14430.1
SML_00001 STG00001 STG00009 RSJ14430.1
SML_00001 STG00010 STG00001 RSJ14430.1
SML_00002 STG02878 STG02733 RSJ13445.1
SML_00002 STG00001 STG00010 RSJ13445.1
SML_00002 STG02880 STG02733 RSJ13445.1
SML_00002 STG00001 STG00011 RSJ13445.1

结果文件将就像

SML_00001 STG00001 STG00009 RSJ14430.1
SML_00001 STG00010 STG00001 RSJ14430.1
SML_00002 STG00001 STG00010 RSJ13445.1
SML_00002 STG00001 STG00011 RSJ13445.1
awk 'NR == FNR {a[$1,$2]=1; a[$2,$1]=1; next} ($2 SUBSEP $3) in a' File_1 File_2

以下是一个很好的起点(未经测试,可能有错误...)

use File::Slurp;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
for my $line (read_file('file1'), chomp => 1) {
   my @symbols = split ' ', $line;
   $ra->add(join ' ', @symbols);
   $ra->add(join ' ', reverse @symbols);
}
for my $line (read_file('file2') {
   say $line if $line =~ /$ra/;
}

通过对字段进行排序,您可以在file1和file2之间进行比较。

#!/usr/bin/perl
use strict;
use warnings;
open my $fh1, '<', 'file1.txt' or die $!;
my %words = map { join('', sort split) => 1} <$fh1>;
close $fh1 or die $!;
open my $fh2, '<', 'file2.txt' or die $!;
while (<$fh2>) {
    my $key = join '', sort ( (split)[1,2] );
    print if $words{$key};
}
close $fh2 or die $!;

相关内容

  • 没有找到相关文章