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

时间:2015-07-01 18:02:18

标签: regex awk compare match multiple-columns

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

这是每个文件的样本:

文件1

Cre01.g000100   
Cre01.g000500  
Cre01.g000650  

file2的

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)

期望的输出

Cre01.g000100  chromosome_1    99034        
Cre01.g000500  chromosome_1    71569   
Cre01.g000650  chromosome_1    93952

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

awk compare 2 files, 2 fields different order in the file, print or merge match and non match lines

Obtain patterns from a file, compare to a column of another file, print matching lines, using awk

awk compare columns from two files, impute values of another column

Obtain patterns in one file from another using ack or awk or better way than grep?

Awk - combine the data from 2 files and print to 3rd file if keys matched

我觉得我应该能够根据这些线程找到它,但是我已经有两天时间尝试不同的代码变体而且我没有得到任何结果。 以下是我尝试在我的文件中使用的一些代码:

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的第3列)的临时矩阵,然后将其与其他文件进行比较。如果匹配,则从文件1打印第一列,从文件2打印第1列和第2列。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

  • 您尚未指定字段分隔符为|
  • 您不能分配到a[$1]
  • 您的示例输出与您想要的输出不一致(示例输出显示文件1中的第1列和文件2中的第1列;所需的输出据称是文件1中的第1列和文件2中的第1列和第2列,虽然这种解释取决于文件2中$3的解释是两个管道符号之间的名称。)

    在创建此答案时引用该问题:

      

    ...比较文件1中的第1列和文件2中的第3列,如果它们匹配则打印file1中的第一列和file2中的第一列。

    desired output
    Cre01.g000100  chromosome_1    99034
    Cre01.g000500  chromosome_1    71569
    Cre01.g000650  chromosome_1    93952
    
  • 我们可以观察到,如果文件2中的$3等于文件1中的值,则可以很容易地将$3打印为保存的值。

    < / LI>

所以,解决这个问题:

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

关键更改是a[$1](以及-F'|')的分配;其余的都是装饰性的,可以调整以满足您的要求(因为问题是自我不一致的,很难给出更好的答案)。