我想比较两个文件 File1.txt 和 File2.txt 的内容。当 File2.txt 的第 1 列中的一行与 File1.txt 的第 1 列中的一行匹配时,我想从 File2.txt 输出整行。如果 File2.txt 中 File1.txt 第 1 列中的行没有匹配项,那么我想打印 File1.txt 的第 1 列中该行的内容,然后是 tab,然后是 0。我也想尝试在输出中保留第 1 列中的行顺序。
文件 1.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 in a
: 遍历数组。
{if ($1 in a) print $0;
如果 File2.txt 中的行与数组中的行匹配,则打印 File2.txt 中的所有行
;else print a[$1],"\t","0"}'
: 如果 File2.txt 中的行与数组中的行不匹配,则打印 File1.txt 中的行,tab,然后是“0”。
但显然不是这样。我不明白我做错了什么。
当前输出:
abc 2
ghi 1
所需的输出:
abc 2
def 0
ghi 1
jkl 0
谁能解释为什么在不匹配时不打印 contents of line in File1.txt
,\t
,0
。
答案 0 :(得分:6)
您可以尝试以下操作吗?用显示的样本编写。您应该在 awk 中更改 Input_file(s) 的读取顺序。在 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