我正在尝试使用比较两个文件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
这两个文件都是制表符分隔的,所以我不确定为什么我的命令不起作用?
答案1
awk解决方案
这个怎么样。没有给出您提供的确切输出,但我不确定为什么, 会按原样d SORCY
打印,即.d
MSTRG3.1
COTJA
不管怎样,就这样吧。十人首发。在 GNU Awk v4.0.2 上运行良好。
$ awk 'NR==FNR{a[$1]=$2}NR!=FNR&&FNR>1&&a[$3]{print $1,a[$3]}' file2 file1
a ALLMI
d COTJA
$
如果 NR 与 FNR 相同,则我们位于第一个文件,因此填充数组。
如果 NR 与 FNR 不同,则我们位于第二个文件,因此一旦我们越过了该文件的第一条记录(标头),并且如果数组中存在字段 3,则打印它。
“高尔夫球”awk 解决方案
可读性较差,但代码较短。
awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}
加入解决方案
或者,如果您不特别需要使用 来实现它awk
,则只需使用join
。
$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$
-1 3
使用文件 1 中的字段 3 ( ) 和文件 2 中的字段 1 ( )连接文件-2 1
。然后从文件 1 中打印字段 1,从文件 2 中打印字段 2。答对了。
答案2
尝试这个,
awk 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1"\t"$3}' file2 file1
- 我们不需要
\t
作为分隔符。 - 我们需要根据您的要求打印第一和第三字段。
答案3
你的代码,
awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1
永远无法输出两列,因为print
最后只输出 的第一列File1
。
不过你已经快到了。您需要进行一项微小的调整,即实际输出缺失的字段:
awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $3, $1}' File2 File1
^^^
add this
在您的数据上运行它应该会产生
MSTRG.1.1 a
MSTRG.3.1 d
对于大型数据集,请参阅史蒂夫的解决方案哪个内存效率更高。