Awk:比较两个文件的内容,打印匹配项和非匹配项

Awk:比较两个文件的内容,打印匹配项和非匹配项,awk,Awk,我想比较两个文件的内容,File1.txt和File2.txt。当File2.txt的第1列中的一行与File1.txt的第1列中的一行匹配时,我想从File2.txt输出整行。如果File2.txt中没有与File1.txt第1列中的行匹配的内容,那么我想打印File1.txt第1列中的行内容,然后是tab,然后是0。我还想尝试在输出中保留第1列中的行的顺序 File1.txt abc def ghi jkl File2.txt abc 2 ghi 1 这是我一直在使用的命令,

我想比较两个文件的内容,File1.txt和File2.txt。当File2.txt的第1列中的一行与File1.txt的第1列中的一行匹配时,我想从File2.txt输出整行。如果File2.txt中没有与File1.txt第1列中的行匹配的内容,那么我想打印File1.txt第1列中的行内容,然后是tab,然后是0。我还想尝试在输出中保留第1列中的行的顺序

File1.txt

abc
def
ghi
jkl
File2.txt

abc    2
ghi    1
这是我一直在使用的命令,但它只输出匹配的实例。它不会打印不匹配的实例,这些实例后面有一个由选项卡分隔的0

awk 'NR==FNR{a[$1];next} $1 in a{if ($1 in a) print $0;else print a[$1],"\t","0"}' File1.txt File2.txt 
我认为代码的作用如下:

awk'NR==FNR{a[$1];next}
:为第一个文件的第1列创建一个数组

$1在一个
中:在数组中循环

{如果a中的($1)打印$0;
如果File2.txt中的行与数组中的行匹配,则打印File2.txt中的所有行

;否则打印一个[$1],“\t”,“0”}”
:如果File2.txt中的行与数组中的行不匹配,请打印File1.txt中的行,制表符,然后是“0”

但情况显然并非如此。我不明白我做错了什么

电流输出:

abc    2
ghi    1
期望输出:

abc    2
def    0
ghi    1
jkl    0

有谁能解释一下,当文件1.txt、
\t、
0
中没有匹配项时,为什么不打印该行的
内容。

请尝试以下内容。用显示的样本书写。您应该在awk中更改输入_文件的读取顺序。在file2.txt之后读取file1.txt的另一个原因是,输出是按照file1打印的,它比较file2中的值,所以最好先读取file2,将所有值都放入数组中,然后再读取file1相应的打印值

awk '
FNR==NR{
  arr[$1]=$2
  next
}
{
  print $0,($1 in arr?arr[$1]:0)
}
' file2.txt file1.txt

太好了,谢谢。那太好了!我现在明白了,在文件2之后读取文件1更有意义。请你再给我解释一下打印报表好吗?我不熟悉
arr?arr[$1]
@Jpike,这些是三元运算符。如果arr中存在第一个字段,则检查条件,然后打印其值,否则打印0。