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

Regex awk搜索一个文件中的列,如果匹配两个文件中的打印列,regex,awk,compare,match,multiple-columns,Regex,Awk,Compare,Match,Multiple Columns,我试图比较文件1中的第1列和文件2中的第3列,如果它们匹配,则打印文件1中的第一列和文件2中的前两列 以下是每个文件的示例: 文件1 文件2 期望输出 Cre01.g000100 chromosome_1 99034 Cre01.g000500 chromosome_1 71569 Cre01.g000650 chromosome_1 93952 我一直在寻找一些相似的线程,但我似乎无法让它打印两个文件中的列。以下是一些相关的链接: 我觉

我试图比较文件1中的第1列和文件2中的第3列,如果它们匹配,则打印文件1中的第一列和文件2中的前两列

以下是每个文件的示例:

文件1

文件2

期望输出

Cre01.g000100  chromosome_1    99034        
Cre01.g000500  chromosome_1    71569   
Cre01.g000650  chromosome_1    93952
我一直在寻找一些相似的线程,但我似乎无法让它打印两个文件中的列。以下是一些相关的链接:

我觉得我应该能够根据这些线程来解决这个问题,但已经两天了,我一直在尝试不同的代码变体,但我什么也没得到。 以下是我在文件中尝试使用的一些代码:

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
我知道我必须创建一个临时矩阵,其中包含file1的第一列(或file2的第三列),然后将其与另一个文件进行比较。如果存在匹配项,则打印文件1的第一列以及文件2的第1列和第2列


谢谢你的帮助

这三次尝试中,你的中间尝试最接近,但是:

  • 您尚未指定字段分隔符为
    |
  • 您没有分配给
    一个[$1]
  • 示例输出与所需输出不一致(示例输出显示文件1中的第1列和文件2中的第1列;所需输出据说是文件1中的第1列和文件2中的第1列和第2列,尽管此解释取决于文件2中的
    $3
    是两个管道符号之间的名称的解释)

    引用创建此答案时的问题:

    …比较文件1中的第1列和文件2中的第3列,如果它们匹配,则打印文件1中的第一列和文件2中的前两列

    desired output
    Cre01.g000100  chromosome_1    99034
    Cre01.g000500  chromosome_1    71569
    Cre01.g000650  chromosome_1    93952
    
  • 我们可以观察到,如果文件2中的
    $3
    等于文件1中的值,那么打印
    $3
    与打印保存的值一样容易

所以,解决这个问题:

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

关键的变化是分配给
a[$1]
(以及
-F'|'
);其余的是修饰性的,可以根据您的要求进行调整(因为问题本身不一致,很难给出更好的答案)。

您可以使用此
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
awk -F'|' 'NR==FNR { a[$1]=1; next } ($3 in a) { print $3, $1 }' file1 file2
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