我正在尝试使用比较两个文件,awk
并且我想将两个文件中的数据打印为输出。我比较的文件如下。
文件1:
gene feature id fc
a gene MSTRG.1.1
b gene MSTRG.1.2
c gene MSTRG.2.1
d gene MSTRG.3.1
文件2:
MSTRG.1.1 ALLMI
MSTRG.3.1 COTJA
MSTRG.4.1 SORCY
我一直在使用以下命令:
$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1
我希望输出为:
a ALLMI
c COTJA
d SORCY,
但是,目前我只得到以下输出:
a
c
d
这两个文件都是制表符分隔的,所以我不确定为什么我的命令不起作用?
awk 解决方案
这个怎么样。没有给出您提供的确切输出,但我不确定为什么
d SORCY
, 会按原样打印d
,MSTRG3.1
即COTJA
.不管怎样,就到这里吧。十人制首发。在 GNU Awk v4.0.2 上运行良好。
如果 NR 与 FNR 相同,则我们在第一个文件上,因此填充数组。
如果 NR 与 FNR 不同,我们在第二个文件,所以一旦我们超过了这个文件的第一条记录(标题),并且如果字段 3 存在于数组中,则打印它。
“打高尔夫球” awk 解决方案
可读性较差,但代码较短。
加入解决方案
或者,如果您不特别需要使用 实现它
awk
,只需使用join
.使用文件 1 (
-1 3
) 中的字段 3 和文件 2 ( ) 中的字段 1连接文件-2 1
。然后从file1打印field 1,从file2打印field2。答对了。尝试这个,
\t
作为分隔符。你的代码,
永远不能输出两列,因为
print
最后只输出第一列File1
。不过你快到了。您需要做一个微小的调整,即实际输出缺失的字段:
在您的数据上运行它应该会产生
对于大型数据集,请参阅steve 的内存效率更高的解决方案。