【发布时间】:2014-08-21 20:48:06
【问题描述】:
我有一个这种格式的文件:
A,C 0|1 0|2 1|2
我现在需要的是:
A 0|1 0|0 1|0
C 0|0 0|1 0|1
所以,我一开始就分行,这不是问题。
awk 'BEGIN{FS=OFS="\t"}{n=split($1,obs,",");for (i=1;i<=n;i++){$1=obs[i];print}}'
但现在我需要删除第一行中的 2 并删除第二行中的 1 甚至将第二行中的 2 替换为 1。
我希望这是可以理解的。数字指的是 A(1) 和 C(2)。 我的想法是使用 gsub 并将除当前行的数字之外的所有数字替换为零。
但是有两个问题我无法解决:
1.以下不起作用(对于第 2 行):
awk 'BEGIN{FS=OFS="\t"}{n=split($1,obs,",");for (i=1;i<=n;i++){$1=obs[i];for(j=2;j<=NF;j++){gsub(/[1-9[^2]]/,0,$j)};print}}'
这不应该匹配除 2 之外的所有数字吗?
2.即使这样可行,我也需要用变量(当前行号)替换正则表达式中的数字。
对此有什么想法吗?
编辑: 它可能像这样更复杂: 输入
A,C,G,GA 0|1 0|2 1|2 2|3 4|0
期望的输出:
A 0|1 0|0 1|0 0|0 0|0
C 0|0 0|2 0|1 1|0 0|0
A 0|0 0|0 0|0 0|1 0|0
GA 0|0 0|0 0|0 0|0 1|0
【问题讨论】:
-
我无法得到需求的逻辑。您稍后在
$1上使用了split循环遍历它,因此它可以有两个以上的字符串,以逗号分隔。你能解释一下转换的规则是什么吗?更多例子更好? -
这是基因型信息。所以人的DNA序列有变化。例如,这个位置可以有字母(核苷酸)A 或 C。每个字段为 0|0 0|1 等等都是一个人。所以我想要做的是拆分这些行,以便 A 有一行,C 有一行。但这意味着:在第一行(核苷酸 A)中,我必须删除所有 2(2|0 2| 1 ...)因为它们指的是C。在第二行中我必须删除那些,因为它们指的是A并将2替换为1,因为这里的第一个(唯一)核苷酸现在是C。
-
在第二行你没有“删除”1s,你用
0替换了1。在第一行,您删除了2s。 -
好吧...您删除了原始示例....
-
是的,我把它缩短了,这样更容易看到。是的,我将其替换为 0,这就是我所说的“已删除”对不起。