如何使用awk基于密钥从文件中提取列?

时间:2017-11-03 19:27:21

标签: sorting awk

我有一个密钥文件file1,(新行上的每个密钥),我需要用它来从第二个文件file2中提取某些列。文件1长46行,而file2大得多,>20,000行长。并非file1中显示的所有键都显示在file2中,反之亦然。

文件1:

322510472
322510472
322510472
322510484
322510484
322510484
322510493

file2的:

109287879,Invertebrate_iridescent_virus_3,109287879,148,1,148,NCVOG0391,0
109287880,Invertebrate_iridescent_virus_3,109287880,458,1,458,,
109287881,Invertebrate_iridescent_virus_3,109287881,156,1,156,,
109287882,Invertebrate_iridescent_virus_3,109287882,451,1,451,NCVOG1423,0
109287883,Invertebrate_iridescent_virus_3,109287883,217,1,217,NCVOG4910,2
109287884,Invertebrate_iridescent_virus_3,109287884,494,1,494,NCVOG0211,0
109287885,Invertebrate_iridescent_virus_3,109287885,447,1,447,NCVOG1077,0
109287886,Invertebrate_iridescent_virus_3,109287886,347,1,347,NCVOG0967,2

file1file2都按密钥排序,该密钥显示在file2的第1列和第3列中。

我需要生成第三个文件file3,其中包含来自file1的密钥,以及来自file2的第2列和第7列,并且不会忽略任何存在的密钥在file1中,即使file2中没有匹配的条目。

我知道我的密钥文件file1中有46个条目。但是,当我使用以下awk脚本时,

awk -F"," 'NR==FNR {a[$1]=$1 FS $2 FS $7; next} $1 in a {print a[$1],$2,$7}' file2 file1

我只看到44行输出。

我不需要删除awk输出中的任何键,因为它们对应于我需要保存在包含这些键的其他文件中的实际数据。

有什么建议吗?感谢您的帮助;我已经读了一段时间的堆栈溢出,但这是我第一次提出问题!

1 个答案:

答案 0 :(得分:3)

您的数据没有任何匹配项,因此我修改了您的密钥以包含匹配的条目

$ join -t, -a1 -o1.1,2.2,2.7 file1 file2

109287879,Invertebrate_iridescent_virus_3,NCVOG0391
109287880,Invertebrate_iridescent_virus_3,
109287882,Invertebrate_iridescent_virus_3,NCVOG1423
109287884,Invertebrate_iridescent_virus_3,NCVOG0211
109287886,Invertebrate_iridescent_virus_3,NCVOG0967
322510472,,
322510472,,
322510472,,

这是我用过的文件。

109287879
109287880
109287882
109287884
109287886
322510472
322510472
322510472