AWK:通过两列匹配比较两个文件,不允许使用数组

AWK:通过两列匹配比较两个文件,不允许使用数组,awk,Awk,我有两个包含两列的文件,第二个文件中的一些行与第一个文件中的行匹配,如果它们匹配,则打印匹配行。我不能使用数组,因为文件非常大 我有一个小小的想法,将一行接一行地与getline进行比较。但我不明白 你能帮我吗 第一个文件: ut Adélaïde Male Latvian Chippewa proin Åke Male Zulu Eskimo scelerisque Åke Female Maltese Central American sit Åke Male

我有两个包含两列的文件,第二个文件中的一些行与第一个文件中的行匹配,如果它们匹配,则打印匹配行。我不能使用数组,因为文件非常大

我有一个小小的想法,将一行接一行地与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 拉脱维亚男性齐佩瓦酒店 proinÅke Male祖鲁爱斯基摩人 马耳他中美洲女性权杖 西塔克马累北部索托亚基 北索托派尤特射手座男性 罗马尼亚洪都拉斯女法官阿尔梅林达 塞德·阿尔梅林达男性匈牙利纳瓦霍人 阿尔梅林达男性格鲁吉亚洪都拉斯人 第二个文件:

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 阿德拉德马累酒店 奥克女性 艾莉丝·梅洛 阿尔梅林达男酒店 输出:

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;
 }
}
开始{
FS=“\t”;
n=获取行V0(V0)
{
如果(n>0)
{
n=获取线V00)
{
n=getline;
}
出口
}
}
如果(wrd==V0)
{
打印$0;下一步;
}
其他的
{
下一个
}
}

这就是您所要求的(对gensub()使用GNU awk,对其他awk使用2个sub或类似):

$cat tst.awk
开始{db=ARGV[2];删除ARGV[2];ARGC-->
{
key=gensub(/^\S+\S+(\S+\S+\S+).*/,“\\1”,1)
而((getline0){
如果(键==行){
打印
打破
}
}
关闭(db)
}
$awk-f tst.awk文件1文件2
拉脱维亚男性齐佩瓦酒店
马耳他中美洲女性权杖
北索托派尤特射手座男性
塞德·阿尔梅林达男性匈牙利纳瓦霍人
阿尔梅林达男性格鲁吉亚洪都拉斯人

但是,如果file2太大,无法放入阵列中,那么上述操作可能会太慢,无法在任何合理的时间内完成。

谢谢,现在我添加您要求的内容!谢谢,何塞·里卡多。@Criatos在第二个文件中,是男性而不是女性吗?@Criatos你能试试吗?
awk'FNR==NR{a[$1”“$2];下一个}$2”“$3在一个文件2中1
我不太理解你的预期输出@Jose Ricardo是的!。第一个文件的第二列和第三列必须与第二个文件的第一列和第二列匹配。如果是,则打印第一个文件的第一行。谢谢。我不知道我做错了什么,但这对我没用。没有打印任何行。我正在使用另一个awk。这正是我要找的。谢谢,你很好。如果您考虑再次使用getline,请确保阅读并完全理解在中使用getline的所有含义。这几乎总是错误的做法。