Unix awk比较2个文件,打印匹配行和非匹配行

Unix awk比较2个文件,打印匹配行和非匹配行,unix,awk,Unix,Awk,在本例中,需要比较两个文件f1.txt和f2.txt并获得匹配项和非匹配项,对于这种情况,我希望匹配第二个文件的第二个字段和第一个文件的第一个字段。并首先打印f2.txt的第二个字段,然后打印f1.txt的整行。对于f2.txt上未找到匹配项,请声明“未找到”,然后打印f1.txt整行 F1.txt 1;2;3;4;5;6;7;8 1a;2;3;4;5;6;7;8 1b;2;3;4;5;6;7;8 2b;2;3;4;5;6;7;8 First;1 Firsta;1a Firstb;1

在本例中,需要比较两个文件f1.txt和f2.txt并获得匹配项和非匹配项,对于这种情况,我希望匹配第二个文件的第二个字段和第一个文件的第一个字段。并首先打印f2.txt的第二个字段,然后打印f1.txt的整行。对于f2.txt上未找到匹配项,请声明“未找到”,然后打印f1.txt整行

F1.txt

1;2;3;4;5;6;7;8 
1a;2;3;4;5;6;7;8 
1b;2;3;4;5;6;7;8 
2b;2;3;4;5;6;7;8
First;1 
Firsta;1a 
Firstb;1b
F2.txt

1;2;3;4;5;6;7;8 
1a;2;3;4;5;6;7;8 
1b;2;3;4;5;6;7;8 
2b;2;3;4;5;6;7;8
First;1 
Firsta;1a 
Firstb;1b
期望输出:

First;1;1;2;3;4;5;6;7;8
Firsta;1a;1a;2;3;4;5;6;7;8
Firstb;1b;1b;2;3;4;5;6;7;8
Not Found;Not Found;2b;2;3;4;5;6;7;8

已尝试但不起作用:

awk -F";" 'NR==FNR{a[$1]=$0;b[$1]=$0;next}{ if (a[$2]=b[$1]) print a[$1],$0;else print "NotAvailable","NotAvailable", $0;}' OFS=";" f2.txt f1.txt

你很接近。以下是正确的脚本:

$ awk -F ";" 'NR==FNR{a[$2]=$0;next}{print (a[$1]?a[$1]:"Not Found;Not Found") ";" $0}' F2.txt F1.txt 
First;1;1;2;3;4;5;6;7;8
Firsta;1a;1a;2;3;4;5;6;7;8
Firstb;1b;1b;2;3;4;5;6;7;8
Not Found;Not Found;2b;2;3;4;5;6;7;8

注意从输入文件中删除任何尾随空格。

谷歌搜索过任何类似问题吗?您应该在StackOverflow上单独找到大约100000个。尝试了这个命令,但它不起作用,awk-F“;“NR==FNR{a[$1]=$0;b[$1]=$0;next}{if(a[$2]=b[$1])打印a[$1],$0;否则打印“NotAvailable”,“NotAvailable”,$0;}'OFS=“;“f2.txt f1.txt在Cygwin中运行这个命令时,我得到了错误的输出$awk-F”;“NR==FNR{a[$2]=$0;next(a[$1])[$1]:“未找到;未找到”);“$0}'f2.txt f1.txt未找到;未找到;1;2;3;4;5;6;7;8未找到;未找到;1a;2;3;4;5;5;6;7;8第一个B;1b;1b;2;3;4;5;5;6;6;7;8未找到;2b;2;3;4;5;6;7;8@user3214143检查文件中是否有空格。如果这些空格在行尾,则会将其打断。此外,如果您在windows下创建了这些文件,请运行
dos2unix
以更正换行符感谢您的输入,dos2unix仍然没有获得正确的输出NotAvailable;NotAvailable;1;2;3;4;5;7;8 NotAvailable;NotAvailable;1a;2;3;4;4;5;6;7;8 NotAvailable;NotAvailable;1b;2;3;3;4;5;6;7;8 NotAvailable;2b;2;3;4;4;5;6;7;8非常感谢,您好,如果我需要比较f1.txt和f1.txt的第3列,该命令是什么f2.TXT2;3;1;4;5;6;7;82;3;1a;4;5;6;7;82;3;1b;4;5;6;7;82;3;2b;4;5;6;6;6;7;8的第二列然后,你应该使用
a[$1]
谢谢,它工作得很好。。