通过awk

时间:2018-05-23 11:52:05

标签: awk merge match

我以为我理解如何合并文件。你能告诉我,我的剧本中的问题在哪里?

INPUT:

文件1

 c.001A>C   11  p.His103    A
 c.000A>C   12  p.Thr102    E
 c.111A>C   12  p.Thr102    D

file2的

APC 5   112835056   ENST00000507379 13  c.001A>C    p.Val599Phe  
APC 5   112819143   ENST00000257430 9   c.1111G  p.G371X
APC 5   1128395514  ENST00000257430 15  c.001A>C     p.Glu1309AspfsT
APC 5   112838773   ENST00000257430 15  c.000A>C    p.Gln1062Ter

输出:

APC 5   112835056   ENST00000507379 13  c.001A>C    p.Val59   c.001A>C  11  p.His103    A
APC 5   1128395514  ENST00000257430 15  c.001A>C    p.Glu1    c.001A>C  11  p.His103    A
APC 5   112838773   ENST00000257430 15  c.000A>C    p.Gln10   c.000A>C  12  p.Thr102    E

到目前为止,已尝试使用以下awk行:

awk -F'\t' -v OFS="\t" 'FNR==NR{a[$1]=$1FS$2FS$3FS$4; next} {if ($6 in a) print $0, a[$1]}' file1 file2

我想将file1 column1与file2 column6合并,并仅打印匹配和两个文件中的所有列。但它不起作用。 谢谢

2 个答案:

答案 0 :(得分:2)

如果您可以使用GNU工具,则可以使用joinsortcolumn命令合并这两个文件:

$ join -1 1 -2 6 -o "2.1 2.2 2.3 2.4 2.5 2.6 2.7 1.3 1.4" <(sort file1) <(sed 's/ \+/ /g' file2 | sort -k6) | column -t
APC  5  112838773   ENST00000257430  15  c.000A>C  p.Gln1062Ter     p.Thr102  E
APC  5  1128395514  ENST00000257430  15  c.001A>C  p.Glu1309AspfsT  p.His103  A
APC  5  112835056   ENST00000507379  13  c.001A>C  p.Val599Phe      p.His103  A

join命令根据file1的第一列和file2的第6列合并文件。此命令需要使用<(...)对两个文件进行排序输入。选项-o列出了您要显示的所有列。

注意sed命令会删除重复的空白区域,以便为sort(第二个文件)提供正确的列号。

最后column -t很好地以列样式显示字段。

答案 1 :(得分:0)

不确定输出中的第6个字段之谜(在评论中也提到)如果是错字,那么下面的内容可以帮助你。

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