我试图通过部分重叠标识符(基因#)与预先定义缺失值,并保持第一顺序表的选项列合并两个未排序制表符分隔的文件。
当我的两个例子表遗漏值使用paste
最终成为空的空间。
cat file1
c3 100 300 gene4
c1 300 400 gene1
c13 600 700 gene2
cat file2
gene1 4.2 0.001
gene4 1.05 0.5
paste file1 file2
c3 100 300 gene1 gene1 4.2 0.001
c1 300 400 gene4 gene4 1.05 0.5
c13 600 700 gene2
正如你看到的结果并不出人意料地表现出非匹配的行空的空间。有没有一种方法来保持文件1的顺序和填补像第三行,如下所示:
c3 100 300 gene1 gene1 4.2 0.001
c1 300 400 gene4 gene4 1.05 0.5
c13 600 700 gene2 NA 1 1
我假设的一种方式可能是建立一个awk
条件结构。这将是巨大的,如果你能在正确的方向指向我。
随着awk
请尝试以下方法:
awk 'FNR==NR {a[$1]=$1; b[$1]=$2; c[$1]=$3; next}
{if (!a[$4]) {a[$4]="N/A"; b[$4]=1; c[$4]=1}
printf "%s %s %s %s\n", $0, a[$4], b[$4], c[$4]}
' file2 file1
其中收益率:
c3 100 300 gene1 gene1 4.2 0.001
c1 300 400 gene4 gene4 1.05 0.5
c13 600 700 gene2 N/A 1 1
AWK“FNR == NR {A [$ 1] = $ 1; B [$ 1] = $ 2; C [$ 1] = $ 3;下一个} {如果{A [$ 4] = “N / A”(一个[$ 4]!); B [$ 4] = 1; C [$ 4] = 1} printf的 “%S%S%S%S \ n”,$ 0,则[$ 4],B [$ 4],C [$ 4]}“file2的文件file1
[说明]
FNR==NR { command; next}
是读取所述参数列表中的第一文件(在这种情况下,“文件2”)仅当要执行的命令的习惯用法。然后它创建地图(又名关联数组)到值“文件2”到genes
关联如:
gene1 => gene1 (with array a)
gene1 => 4.2 (with array b)
gene1 => 0.001 (with array c)
gene4 => gene4 (with array a)
gene4 => 1.05 (with array b)
gene4 => 0.5 (with array c)
next
声明这些线路被跳过下面的代码行被执行。{if (!a[$4]) ..
是分配变量时关联数组a[gene]
未定义为默认值的回退(意味着gene
未在“文件2”中找到)。gene
关联值的内容。您可以使用join
:
join -e NA -o '1.1 1.2 1.3 1.4 1.5 2.1 2.2 2.3' -a 1 -1 5 -2 1 <(nl -w1 -s ' ' file1 | sort -k 5) <(sort -k 1 file2) | sed 's/NA\sNA$/1 1/' | sort -n | cut -d ' ' -f 2-
-e NA
- 替换NA
所有缺失值
-o ...
- 输出格式(电场是利用<file>.<field>
指定)
-a 1
- 保持每行左边文件
-1 5
,-2 1
- 菲尔兹用加入文件
file1
,file2
- 该文件
nl -w1 -s ' ' file1
- 有个行文件1
<(sort -k X fileN)
- 文件N准备在列X要加入
s/NA\sNA$/1 1/
- 更换与NA NA
行的目的,每个1 1
| sort -n | cut -d ' ' -f 2-
- 数字排序和删除第一列
上面的例子中对输出使用的空间。要使用标签,追加| tr ' ' '\t'
:
join -e NA -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' -a 1 -1 4 -2 1 file1 file2 | sed 's/NA\sNA$/1 1/' | tr ' ' '\t'
虚线有TAB作为最后一个字符。解决这个问题有
paste file1 file2 | sed 's/\t$/\tNA\t1\t1/g'