为了说明我的问题,这里有一个简单的例子:
cat file1.txt
user1
user2
user3
user4
cat file2.txt
user1 0
user2 3
user3 8
user6 9
awk 'NR==FNR { a[$1]=$2;下一个 } { 打印 $1, a[$1] ? a[$1] : "NA"}' file2.txt file1.txt
user1 NA
user2 3
user3 8
user4 NA
我需要在 user1 之后打印 0
,但它打印 NA
就好像 user1
没有在 file2 中退出。 txt
我确信有一个简单的解决方案,但为什么会出现这种情况?
PS。我知道这里的grep -f
解决方案,但我只是想知道我在数组中做错了什么。
最佳答案
当将表达式作为 bool 条件求值时,AWK 会将数值为零的字符串视为假,因此对于关联编号为 0 的用户,您始终会得到“NA”。(空字符串也是如此,如果用户在 file2.txt
中列出且其姓名后面根本没有数字,则该空字符串将出现在数组中。)
要可靠地打印 file2.txt
中的所有数字,您需要更改依赖于 a[$1] 的值的测试条件
改为仅检查数组中$1
键是否存在。这应该有效:
print $1, ($1 in a ? a[$1] : "NA")
如果数组中完全缺少 key ,则只会打印“NA”。
关于arrays - 包含 0 的 awk 数组打印为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42476549/