【发布时间】:2018-03-09 15:32:18
【问题描述】:
我有一段代码给了我以特定模式“基因”开头的第一列,它看起来像这样:
awk -F '\t|;' '{for(i=9;i<=NF;i++){if($i~/^gene=/){column=$i}} print column, column}' file
文件看起来像这样
contig_1 Prodigal:2.6 CDS 28 609 . + 0 ID=PROKKA_00001;eC_number=1.-.-.-;inference=...;WayMoreColumns
contig_10 Prodigal:2.6 CDS 1031 1813 . + 0 ID=PROKKA_00015;eC_number=4.2.1.-;gene=caiD_1;inference=...;WayMoreColumns
contig_10 Prodigal:2.6 CDS 1031 1813 . + 0 ID=PROKKA_00015;eC_number=0.0.0.0;gene=caiD_1;inference=...;WayMoreColumns
contig_10 Prodigal:2.6 CDS 1832 2533 . - 0 ID=PROKKA_00016;gene=gmuR;inference=...;WayMoreColumns
contig_10 Prodigal:2.6 CDS 43 1014 . + 0 ID=PROKKA_00014;inference=...;WayMoreColumns
所以有些行包含“基因”,有些不包含(我不需要这些),但有些行在上一列中提供了额外的信息,带有“eC_number”。由于可以为不同的基因(在极少数情况下)给出相同的“基因”名称,这有助于识别它到底是哪一个(在第 2 行和第 3 行中构成示例)。
是否有一种尴尬的方式来说“column - $1”来打印上一列,例如包含数组“列”这个信息?或者我应该单独检查以“gene”开头和以“eC-number”开头的字段?
作为输出,包含上一列是可以的,无论它是以“eC_number”还是“ID”开头,因为之后清理应该很容易。但是“基因”必须在行,单独的eC_number没有帮助。
期望的输出:
eC_number=4.2.1.- gene=caiD_1
eC_number=0.0.0.0 gene=caiD_1
ID=PROKKA_00016 gene=gmuR
谢谢!
【问题讨论】:
-
作为一个通用的解决方案,awk 支持 $n 指向字段 n。您可以使用适合您需要的任何计算来构建变量 n,例如 n = column - 1。
-
@setop:这听起来是个不错的建议,但经过我所有的尝试,我只实现了“gene=caiD_1 - 1”之类的东西……你如何使用 $n?我找不到关于它的文档
标签: awk