awk打印匹配行或“未知”如果不匹配
在awk
下面,我试图匹配file1
中的每行到file2
中的一行。如果在两个文件之间没有找到匹配,则打印值file1
后面跟着unknown
。在第一个awk
中,我收到else
语句附近的Synatax错误,第二个语法为next
。我不确定为什么语法错误需要else
来捕获unknown
条件,next
告诉awk
要处理下一行,对不对,或者我误以为是在思考?这两个文件都是space-delimited
,谢谢:)。awk打印匹配行或“未知”如果不匹配
file1的
A2M
A4GALT
A4GNT
ABC34
file2的
A2M AD
ABC34 AD/AR
期望的输出
A2M AD
A4GALT unknown
A4GNT unknown
ABC34 AD/AR
AWK
awk 'NR==FNR{A[$1];next}$1 in A else { print "unknown" }' file1 file2
awk 'BEGIN{FS=OFS="\t"} # define field and output seperators
FNR==NR{ # process each field in line of `file1`
for (i=1; i <= n; i++) { # execute loop
d[$1] = $1 # match first element and read into key d
}
}
next # process next line
}{print $1, ($1 in d?d[$1]:"unknown")}' file1 file2 # if no match
print $1 followed by unknown
简单加入 + 排序一个班轮到达目标:
join -a1 -a2 -e "unknown" -o1.1,2.2 <(sort file1) <(sort file2)
输出:
A2M AD
A4GALT unknown
A4GNT unknown
ABC34 AD/AR
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
超出了{...}
对中的任何一对,并且您有太多的}
s。你可以算他们看看。
非常感谢。我试图遵循'awk'{if($ 0 ==“your_match”){print“match”} else {print“no match”}}''像这样......但我认为'(condition {action} )'更多是我需要尝试的。计数后我确实看到了额外的大括号,但它是在我发布之后。我做了很多,但从他们身上学到更多:)。 – Chris
我的观点是,AFAIK没有任何语言,否定'IF条件DO动作'的否定'IF条件ELSE动作',awk遵循与所有其他简单的基于Algol的语言相同的规则,所以没有理由疯狂猜测在语法上,如果你不知道它 - 如果你不想阅读手册页或查看脚本的其他例子,那么至少尝试一下你熟悉的任何其他语言的东西,而不是事物这不适用于任何语言。 –
我想出了这样一个:
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
你有一个语法错误,因为你的报价是不平衡的。尝试将你的awk代码移动到一个文件中 - 关于awk的一个鲜为人知的事实是,你可以像使用任何其他编程语言一样将你的代码放在一个文件中,你不需要把它全部用单行来完成。 –
如果这个事实“鲜为人知”,我会感到惊讶,它正好位于每个awk手册页,书和POSIX规范的顶部/前面,并且经常在这里和其他论坛的答案中使用。 –