awk打印匹配行或"未知"如果不匹配

时间:2017-08-28 11:59:09

标签: awk

在下面的awk中,我尝试将file1中的每一行与file2中的一行匹配。如果在两个文件之间未找到匹配项,则会打印$1后跟file1的{​​{1}}值。在第一个unknown中,我在awk语句附近收到了synatax错误,在else的第二个语法中收到了synatax错误。我不确定为什么需要next语法错误来捕获else条件而unknown告诉next来处理下一行,对,或者我错了在我的思考?这两个文件都是awk,谢谢:)。

文件1

space-delimited

file2的

A2M
A4GALT
A4GNT
ABC34

所需的输出

A2M AD
ABC34 AD/AR

AWK

A2M AD
A4GALT unknown
A4GNT unknown
ABC34 AD/AR

3 个答案:

答案 0 :(得分:1)

简单 加入 + 排序 单行以达到目标:

join -a1 -a2 -e "unknown" -o1.1,2.2 <(sort file1) <(sort file2)

输出:

A2M AD
A4GALT unknown
A4GNT unknown
ABC34 AD/AR

答案 1 :(得分:1)

awk 'NR==FNR{a[$1]=$2;next} {print $1, ($1 in a ? a[$1] : "unknown")}' file2 file1

第一个脚本中的语法错误是:

$1 in A else

你可能意味着:

!($1 in A)

但是我很好奇你是怎么想出来的 - 你用condition else作为否定condition的有效语法的语言是什么?您已经问了几十个问题并收到了答案 - 他们都没有使用!运算符吗?

第二个脚本中的语法错误是因为next超出了任何{...}对,并且您有}个太多。你可以把它们算上来看看。

答案 2 :(得分:1)

我想出了这个:

awk 'NR==FNR{ a[$1]; next }$1 in a{ print $1,$2; delete a[$1] }END{ for ( i in a ) print i, "unknown" }' file1 file2 | sort

输出:

A2M AD
A4GALT unknown
A4GNT unknown
ABC34 AD/AR