2017-08-28 99 views
0

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 
+1

你有一个语法错误,因为你的报价是不平衡的。尝试将你的awk代码移动到一个文件中 - 关于awk的一个鲜为人知的事实是,你可以像使用任何其他编程语言一样将你的代码放在一个文件中,你不需要把它全部用单行来完成。 –

+0

如果这个事实“鲜为人知”,我会感到惊讶,它正好位于每个awk手册页,书和POSIX规范的顶部/前面,并且经常在这里和其他论坛的答案中使用。 –

回答

1

简单加入 + 排序一个班轮到达目标:

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

输出:

A2M AD 
A4GALT unknown 
A4GNT unknown 
ABC34 AD/AR 
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超出了{...}对中的任何一对,并且您有太多的} s。你可以算他们看看。

+0

非常感谢。我试图遵循'awk'{if($ 0 ==“your_match”){print“match”} else {print“no match”}}''像这样......但我认为'(condition {action} )'更多是我需要尝试的。计数后我确实看到了额外的大括号,但它是在我发布之后。我做了很多,但从他们身上学到更多:)。 – Chris

+0

我的观点是,AFAIK没有任何语言,否定'IF条件DO动作'的否定'IF条件ELSE动作',awk遵循与所有其他简单的基于Algol的语言相同的规则,所以没有理由疯狂猜测在语法上,如果你不知道它 - 如果你不想阅读手册页或查看脚本的其他例子,那么至少尝试一下你熟悉的任何其他语言的东西,而不是事物这不适用于任何语言。 –

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 
+0

你的意思是:awk'NR == FNR {a [$ 1];下一个}在{print $ 1,$ 2;删除[$ 1]} END {for(i in a)print a [i],“unknown”}'file1 file2 |排序? – JFS31

+0

但是这并没有给出预期的输出,所以我为什么做了[$ 1] = $ 1。 – JFS31

+1

是的,现在工作:)我会在答案中改变它。 – JFS31