【问题标题】:How to add multiple columns to a file from another file如何将多个列从另一个文件添加到一个文件
【发布时间】:2014-12-12 08:16:45
【问题描述】:

我有两个如下所示的以​​制表符分隔的文件:

文件 A

chr1   123 aa b c d
chr1   234 a  b c d
chr1   345 aa b c d
chr1   456 a  b c d
....

文件B

chr1   123    aa    c    d    e   ff
chr1   345    aa    e    f    g   gg
chr1   123    aa    c    d    e   hh
chr1   567    aa    z    c    a   ii
chr1   345    bb    x    q    r   kk
chr1   789    df    f    g    s   ff
chr1   345    sh    d    t    g   ll

...

我想根据 2 个关键列“chr1”、“123”,即(前两列是关键列),从文件 B 向文件 A 添加一个新列。如果两个文件中的键列都匹配,则应将文件 B 中第 7 列的数据添加到文件 A 中的第 3 列。

例如 (chr1 123) 键在文件 B 中出现两次,因此文件 A 中的第 3 列的 ff 和 hh 用逗号分隔。如果未找到密钥,则应输入 NA,输出应如下所示: 输出:

chr1   123  ff,hh       aa    b    c    d   
chr1   234    NA        a     b    c    d
chr1   345  gg,kk,ll    aa   b    c    d
chr1   456    NA        a    b    c     d

我使用 awk 解决方案实现了这一点

awk -F'\t' -v OFS='\t' 'NR==FNR{a[$1FS$2]=a[$1FS$2]?a[$1FS$2]","$7:$7;next}{$3=(($1FS$2 in a)?a[$1FS$2]:"NA")FS $3}1' fileB fileA

现在,我想在第 7 列中添加另一个第 6 列。有人可以建议如何执行此操作吗? 输出如下:

chr1   123  ff,hh    e,e     aa    b    c    d   
chr1   234    NA     NA      a     b    c    d
chr1   345  gg,kk,ll g,r,g   aa   b    c    d
chr1   456    NA      NA     a    b    c     d

谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    我的建议是使用另一个数组来跟踪您要添加的下一个变量,但为了使代码更具可读性,我制作了一个可执行的 awk 脚本来概括一下:

    #!/usr/bin/awk -f
    
    BEGIN { FS="\t"; OFS="\t" }
    
    { key = $1 FS $2 }
    
    FNR==NR {
        updateArray( a, $7 )
        updateArray( b, $6 )
        next
    }
    
    { $3 = concat( a, concat( b, $3 ) ) }
    
    1
    
    function updateArray( arr, fld ) {
        arr[key] = arr[key]!="" ? arr[key] "," fld : fld
    }
    
    function concat( arr, suffix ) {
      return( (arr[key]=="" ? "NA" : arr[key]) OFS suffix )
    }
    

    以下是细分:

    • 设置FSOFS
    • 为读取的每一行创建一个全局 key
    • 将第一个文件中的数据存储在数组ab 中,它们通过引用传递给函数updateArray,并且字段值通过值传递
    • 使用本地 concat 函数更新 $3
    • 使用1 打印更新的行

    作为另一种选择,您可以使存储在单个a[key] 中的值等于您希望在$3 中表示的所有file B 字段,并用OFS 分隔它们。这将需要在每次 file B 被解析时解析并重新组装 a[key] 中的值,但会使创建 $3 成为简单的三部分连接。

    【讨论】:

    • 谢谢。第 7 列运行良好。但是,第 6 列只获取一次变量。即,而不是 e,e 它只打印 e。
    • 它对我有用,但我正在复制和粘贴文件内容并调整它们以使用单个标签作为分隔符。 awk -F"\t" '$2 ~ /123/ { print $6 }' B 向您展示了什么?我得到了两个es。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2020-03-19
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多