awk搜索一个文件中的列,如果匹配两个文件中的打印列

Luk*_*cme 5 regex awk compare match multiple-columns

我正在尝试比较文件1的列1和文件2的列3,如果它们匹配,则打印文件1的第一列和文件2的第二列。

这是每个文件的样本:

文件1

Cre01.g000100   
Cre01.g000500  
Cre01.g000650  
Run Code Online (Sandbox Code Playgroud)

文件2

chromosome_1    71569  |655|Cre01.g000500|protein_coding|CODING|PAC:26902937|1|1)
chromosome_1    93952  |765|Cre01.g000650|protein_coding|CODING|PAC:26903448|11|1)
chromosome_1    99034  |1027|Cre01.g000100 |protein_coding|CODING|PAC:26903318|9|1)
Run Code Online (Sandbox Code Playgroud)

期望的输出

Cre01.g000100  chromosome_1    99034        
Cre01.g000500  chromosome_1    71569   
Cre01.g000650  chromosome_1    93952
Run Code Online (Sandbox Code Playgroud)

我一直在研究各种相似的线程,但是似乎无法从两个文件中打印列。以下是一些相关的链接:

awk比较2个文件,文件中2个字段的顺序不同,打印或合并匹配行和不匹配行

从文件获取模式,与另一个文件的列进行比较,使用awk打印匹配的行

awk比较两个文件中的列,估算另一列的值

使用ack或awk或比grep更好的方法从另一个文件中获取模式?

AWK-结合2个文件中的数据并在键匹配的情况下打印到第3个文件

我觉得我应该能够根据这些线程来解决这个问题,但是经过两天的时间,我一直在尝试各种不同的代码版本,但是我什么都没得到。这是我尝试在文件上使用的一些代码:

awk 'FNR==NR{a[$3]=$1;next;}{print $0 ($3 in a ? a[$3]:"NA")}' file1 file2

awk 'NR==FNR{ a[$1]; next} ($3 in a) {print $1 $2 a[$1]}' file1 file2

awk 'FNR==NR{a[$1]=$0; next}{print a[$1] $0}' file1 file2
Run Code Online (Sandbox Code Playgroud)

我知道我必须创建一个临时矩阵,其中包含file1的第一列(或file2的第三列),然后将其与另一个文件进行比较。如果有匹配项,则从文件1打印第一列,从文件2打印第一列和第二列。

谢谢您的帮助!

anu*_*ava 2

你可以使用这个awk:

awk -F '[| ]+' -v OFS='\t' 'NR==FNR{a[$4]=$1 OFS $2; next}
       $1 in a{print $1, a[$1]}' file2 file1
Cre01.g000100   chromosome_1    99034
Cre01.g000500   chromosome_1    71569
Cre01.g000650   chromosome_1    93952
Run Code Online (Sandbox Code Playgroud)