【发布时间】:2016-08-28 19:20:04
【问题描述】:
我想合并 2 个文件并将其分配给一个新文件,同时最好在 unix 中使用 awk 添加一个新的不存在的列:
文件 1:VDR.txt 没有标题,是空格分隔的,如下所示:
chr12-45000000-50000000 --- rs192072617 48225416 0.000 0.270 0.999 0 -1 -1 -1
chr12-45000000-50000000 --- rs181728325 48225429 0.000 0.144 1.000 0 -1 -1 -1
chr12-45000000-50000000 --- rs187216594 48225500 0.000 0.007 1.000 0 -1 -1 -1
文件 2:METAL1.tbl 有一个标题,是制表符分隔的,如下所示:
MarkerName Allele1 Allele2 Weight Zscore P-value Direction HetISq HetChiSq HetDf HetPVal
rs192072617 a g 2887.00 1.579 0.1143 ++ 0.0 0.032 1 0.8579
rs7929618 c g 2887.00 -1.416 0.1568 -+ 47.4 1.899 1 0.1681
rs181728325 t c 2887.00 1.469 0.1419 ++ 73.9 3.830 1 0.05033
rs7190157 a c 2887.00 1.952 0.05088 +- 72.7 3.669 1 0.05542
rs12364336 a g 2887.00 -1.503 0.1328 -+ 69.8 3.306 1 0.06902
rs187216594 t c 2887.00 -0.082 0.9349 +- 74.8 3.964 1 0.04649
rs12562373 a g 2887.00 -0.290 0.7717 -+ 0.0 0.150 1 0.6984
文件的行数不相等,第一个文件 (VDR.txt) 比第二个文件 (METAL1.tbl) 短得多。
我想:
- 按第一个文件 (VDR.txt) 的第 3 列和第二个文件 (METAL1.tbl) 的第 1 列合并这些文件。
- 仅保留第一个文件 (VDR.txt) 中的第 1、2、3 和 4 列以及第二个文件 (METAL1.tbl) 中的所有列。
- 仅保留第一个文件 (VDR.txt) 第一列中第一个破折号
"-"之前的字符 - 在输出文件中添加一个重复某个字符串(例如“VDR”)的新列
- 输出文件不必有标题,但如果有必要,最好有下面给出的标题。
所以我想要一个最后看起来像这样的输出文件(output.txt):
gene MarkerName chr BP impute Allele1 Allele2 Weight Zscore P-value Direction HetISq HetChiSq HetDf HetPVal
VDR rs192072617 chr12 48225416 --- a g 2887 1.579 0.1143 ++ 0 0.032 1 0.8579
VDR rs181728325 chr12 48225429 --- t c 2887 1.469 0.1419 ++ 73.9 3.83 1 0.05033
VDR rs187216594 chr12 48225500 --- t c 2887 -0.082 0.9349 +- 74.8 3.964 1 0.04649
我的尝试:
$ awk 'FNR==NR {a[$1]=$1" "$2" "$3" "$4" "$5;next}{print $3, gensub(/-.*/, "", $1), $4, $2, a[$3]}' METAL1.tbl VDR.txt
它确实以正确的方式获取了 chr 列和列顺序,但不幸的是,它只打印了 VDR.txt 中想要的列,而不是合并的文件。
我知道这是一个非常复杂的示例,任何帮助或建议将不胜感激。
谢谢,
梅尔
【问题讨论】:
-
那么你有没有尝试解决这个问题?如果是这样,你应该分享这个。 “这是我的规格,请为我编写代码”形式的问题通常不受欢迎,但“这是我的代码,这是我遇到问题的部分”形式的问题。
-
文件中的字段是如何识别的?固定宽度?或者分隔符是什么?
-
我建议将您的数据样本减少到 4 列左右(足以解决根本问题)。你知道unix/linux命令
join吗?如果您可以使用分隔数据(如|或制表符),您可能可以在 1 行中执行您想要的操作。但是我没有仔细查看您的输入和输出(因为它们太宽了;-),所以我可能是错的。祝你好运。 -
您确实需要简化或澄清您的项目符号 (3) 仅保留第一个文件 (VDR.txt) 第一列中第一个破折号之前的字符 -- 在第一个破折号之前而不是前 4 个没有破折号的染色体数小于 10(例如,不希望有 chr7- 但 chr7)。 您的示例数据没有
chr7引用,所以它不是清楚这是怎么一回事。从chr12-45000000-50000000类型名称中获取chr12很容易理解,但是您只是想从chr7-45000000-50000000中获取chr7吗?你既没有展示也没有解释这个额外的皱纹。 -
@JonathanLeffler 我简化了项目符号 3。对不起,我想编写一个功能多样的函数,可以用于可能有一些差异的其他文件。 (但不幸的是有点懒得给出正确的例子)---另外非常感谢你的解决方案,工作得很好而且速度也很快!