如何合并两个制表符分隔的文件和缺失值的预先确定的格式?

问题描述 投票:0回答:3

我试图通过部分重叠标识符(基因#)与预先定义缺失值,并保持第一顺序表的选项列合并两个未排序制表符分隔的文件。

当我的两个例子表遗漏值使用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条件结构。这将是巨大的,如果你能在正确的方向指向我。

bash
3个回答
1
投票

随着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)
  • 这是没有必要的“文件2”进行排序。
  • 读第二个文件(“文件1”),只有当因为看了一号文件时,由于next声明这些线路被跳过下面的代码行被执行。
  • {if (!a[$4]) ..是分配变量时关联数组a[gene]未定义为默认值的回退(意味着gene未在“文件2”中找到)。
  • 最后一行打印“文件1”,接着经由gene关联值的内容。

1
投票

您可以使用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 - 菲尔兹用加入文件

file1file2 - 该文件

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'

0
投票

虚线有TAB作为最后一个字符。解决这个问题有

paste file1 file2 | sed 's/\t$/\tNA\t1\t1/g'
© www.soinside.com 2019 - 2024. All rights reserved.