2015-10-24 89 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的所有含義。這幾乎總是錯誤的方法。 –

相關問題