2015-10-06 80 views
1

我希望到grep为AAABBBCCC从FILE1.TXT在同一线路上的任何顺序FILE2.TXTAWK比较一个文件与另一个文件

FILE1.TXT

aaa bbb ccc 
ddd fff ggg 
hhh ddd jjj 
jjj ccc 

FILE2.TXT

aaa bbb ccc ddd fff ggg --> output whole line since it matches with aaa bbb ccc of file1.txt 
aaa ddd jjj hhh --> no output since it does not match with any search pattern in file1.txt 
ccc ddd fff ggg jjj --> output whole line since it matches with jjj ccc of file1.txt 

这是我想出了这样的脚本远。但不输出任何东西

gawk 'NR==FNR{a[$1,$2,2$3]++;next} ($0 in a)' file1.txt file2.txt 
+0

jjj ccc在file1.txt中的第4行,并且file2.txt中没有line4,所以从技术上讲,只有file2.txt的第一行应该在输出中 –

回答

0

这应该工作:

paste file1.txt file2.txt | awk -F '\t' '$1~/aaa|bbb|ccc/{ print $2}' 

但正如我在我的评论mentionned上有FILE1.TXT 4号线的匹配,但存在不file2的4号线.txt,所以它不会打印任何东西。

使用a作为分隔符粘贴合并两个文件。然后它将paste的输出作为分隔符输入到awk中,其中$1是file1的行,而$2是file2的行。

1

awk来拯救!这是基于该示例,但与您的描述不匹配。

$ awk 'NR==FNR{a[$0];next} 
       {for(i in a) { 
        m=1; n=split(i,b," "); { 
        for(j=1;j<=n;j++) 
         if($0!~b[j]) m=0 
        } 
          } 
       } m{print}' f1 f2 

将导致

aaa bbb ccc ddd fff ggg --> output whole line since it matches with aaa bbb ccc of file1.txt 
ccc ddd fff ggg jjj --> output whole line since it matches with jjj ccc of file1.txt 

注意,线线匹配是不是在你的例子来实现。

+0

它出于某种原因,但它仅输出一行搜索file1.txt的模式。其余的匹配行被省略。 – sdf

+0

@sdf,你的数据是通过Windows通过源代码,编辑器还是ftp(等)传递的?如果是这样,'dos2unix f1 f2 as_many_files_as_you_like'。祝你好运。 – shellter

+0

@karakfa脚本工作,虽然它只返回file1.txt的最后一个条目 – sdf