Jos*_*osh 4 awk text-processing
我正在尝试比较两个文件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
Run Code Online (Sandbox Code Playgroud)
文件2:
MSTRG.1.1 ALLMI
MSTRG.3.1 COTJA
MSTRG.4.1 SORCY
Run Code Online (Sandbox Code Playgroud)
我一直在使用以下命令:
$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1
Run Code Online (Sandbox Code Playgroud)
我希望输出是:
a ALLMI
c COTJA
d SORCY,
Run Code Online (Sandbox Code Playgroud)
但是,目前我只得到以下输出:
a
c
d
Run Code Online (Sandbox Code Playgroud)
这两个文件都以制表符分隔,所以我不确定为什么我的命令不起作用?
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
$
Run Code Online (Sandbox Code Playgroud)
如果 NR 与 FNR 相同,则我们在第一个文件上,因此填充数组。
如果 NR 与 FNR 不同,则我们在第二个文件上,因此一旦我们越过此文件的第一条记录(标题),并且如果数组中存在字段 3,则打印它。
“打高尔夫球”的awk解决方案
可读性较差,但代码较短。
awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}
Run Code Online (Sandbox Code Playgroud)
加入解决方案
或者,如果您不是特别需要使用 实现它awk
,只需使用join
.
$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$
Run Code Online (Sandbox Code Playgroud)
使用文件 1 ( -1 3
) 中的字段 3和文件 2 ( -2 1
) 中的字段 1 连接文件。然后从文件 1 打印字段 1,从文件 2 打印字段 2。答对了。