如何从文件中grep这对单词?

时间:2014-01-21 16:52:31

标签: perl bash shell awk grep

我想在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

3 个答案:

答案 0 :(得分:4)

awk 'NR == FNR {a[$1,$2]=1; a[$2,$1]=1; next} ($2 SUBSEP $3) in a' File_1 File_2

答案 1 :(得分:0)

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

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/;
}

答案 2 :(得分:0)

通过对字段进行排序,您可以在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 $!;