Awk 比较两个文件并打印可用和未找到-续:

Awk 比较两个文件并打印可用和未找到-续:,awk,Awk,要比较F11.txt中的第二个字段和F22.txt中的第一个字段 然后将匹配案例打印为“可用”,将不匹配案例打印为“未找到” 如果字段$4(文件F11.txt)为空,如果字段$4(文件F11.txt)不为空,则按原样打印F11.txt的行 Inputs: F11.txt a,10,zzz b,20,zzz,yyy c,50,zzz F22.txt 10,yyy 20,yyy 30,yyy 40,yyy 已尝试以下命令,谢谢sat的帮助 awk -F "," 'NR==FNR{a[$1]=$

要比较F11.txt中的第二个字段和F22.txt中的第一个字段 然后将匹配案例打印为“可用”,将不匹配案例打印为“未找到” 如果字段$4(文件F11.txt)为空,如果字段$4(文件F11.txt)不为空,则按原样打印F11.txt的行

Inputs:

F11.txt
a,10,zzz
b,20,zzz,yyy
c,50,zzz

F22.txt
10,yyy
20,yyy
30,yyy
40,yyy
已尝试以下命令,谢谢sat的帮助

awk -F "," 'NR==FNR{a[$1]=$0;next}{print $0 "," (a[$2]?"Available":"NotFound")  }' f22.txt f11.txt
获得以下输出

a,10,zzz,Available
b,20,zzz,yyy,Available
c,50,zzz,NotFound
其中as b,20,zzz,yyy为匹配大小写,但不希望覆盖为“可用”,因为$4不为null(空)

预期产出:

a,10,zzz,Avilable
b,20,zzz,yyy
c,50,zzz,NotFound

我相信下面的脚本就是你想要的

BEGIN {
    FS=OFS=","
}

NR==FNR {
    a[$1]=$0
    next
}

!$4 {
    $4 = (a[$2] ? "Available" : "NotFound")
}

1
更新了脚本以明确检查第四个字段是否为空(以允许第四个字段为空的较长行)。 再次更新以替换空的第四个字段,而不是追加字段。

请尝试以下操作:

awk -F, '
NR==FNR {a[$1]=$0;next}
  NF==3 {print $0($2 in a?",Available":",NotFound");next}1
' F22.txt F11.txt
a,10,zzz,Available
b,20,zzz,yyy
c,50,zzz,NotFound

非常好的Etan,非常感谢您的支持!!!请在文章末尾提供一些关于“1”用法的详细信息command@AVN
awk
在true条件下的默认行为是打印行。由于
1
始终是true条件,因此它被解释为
{print$0}
并打印每一行(你甚至可以用4,或7,或任何其他非零值,如果你愿意的话;1正是人们传统上使用的)来建议这个动作。我忘了是谁在这样的情况下,倾向于用
7
而不是
1
。我有点喜欢这个,因为它更突出,至少在我看来,读起来更像一点“注意这是在做什么”,而不是使用
1
做什么。但我还没有说服自己真正开始使用它。@EtanReisner您可能指的是。
:)