2015-10-24 44 views
0

我有两个文件包含两列,第二个文件的一些行匹配第一个文件的行,如果它们匹配匹配的行被打印。我无法使用数组,因为这些文件非常大。AWK:通过两列匹配来比较两个文件,不允许数组

我有一个轻微的想法,比较线条与getline。但我不明白...

你能帮助我吗?

第一个文件:

 
ut Adélaïde Male Latvian Chippewa 
proin Åke Male Zulu Eskimo 
scelerisque Åke Female Maltese Central American 
sit Åke Male Northern Sotho Yaqui 
sagittis Alizée Male Northern Sotho Paiute 
dictumst Almérinda Female Romanian Honduran 
sed Almérinda Male Hungarian Navajo 
volutpat Almérinda Male Georgian Honduran 

第二个文件:

 
Adélaïde Male 
Åke Female 
Alizée Male 
Almérinda Male 

输出:

 
ut Adélaïde Male Latvian Chippewa 
sit Åke Female Northern Sotho Yaqui 
sagittis Alizée Male Northern Sotho Paiute 
sed Almérinda Male Hungarian Navajo 
volutpat Almérinda Male Georgian Honduran 

我的工作

BEGIN { 
FS="\t"; 
n=getline V0 <ll; 
} 
{ 
wrd=$2"\t"$3 
while (wrd>V0) 
{ 
    if (n>0) 
    { 
     n=getline V0 < ll; 
    } 
    else 
    { 
     n=getline; 
     while (n>0) 
     { 
      n=getline; 
     } 
     exit; 
    } 
} 
if (wrd==V0) 
{ 
    print $0;next; 
} 
else 
{ 
    next; 
} 
} 
+0

谢谢,现在我添加你要求的! – Polucho

+0

谢谢,何塞里卡多。 – Polucho

+0

@Criatos在第二个文件中,是'ÅkeMale'而不是'ÅkeFemale'? –

回答

0

这是你问什么(使用GNU AWK的gensub(),使用2级潜艇或与其他awks类似):

$ cat tst.awk 
BEGIN { db=ARGV[2]; delete ARGV[2]; ARGC-- } 
{ 
    key = gensub(/^\S+\s+(\S+\s+\S+).*/,"\\1",1) 
    while ((getline line < db) > 0) { 
     if (key == line) { 
      print 
      break 
     } 
    } 
    close(db) 
} 

$ awk -f tst.awk file1 file2 
ut Adélaïde Male Latvian Chippewa 
scelerisque Åke Female Maltese Central American 
sagittis Alizée Male Northern Sotho Paiute 
sed Almérinda Male Hungarian Navajo 
volutpat Almérinda Male Georgian Honduran 

但如果file2的是这样巨大的它不能适应一个数组然后上面可能会很慢,它不会在任何合理的时间内完成。

+0

谢谢。我不知道我做错了什么,但不起作用。不打印任何行。 – Polucho

+0

我正在使用另一个awk。 这正是我正在寻找的。谢谢。 – Polucho

+0

你好。如果您曾经考虑过再次使用getline,请务必阅读并完全理解在http://awk.info/?tip/getline使用getline的所有含义。这几乎总是错误的方法。 –

相关问题