【问题标题】:How to transpose a repeating set of rows to columns using awk如何使用 awk 将一组重复的行转置为列
【发布时间】:2018-04-03 02:48:19
【问题描述】:

我有一个包含 7 列数据的文本文件,格式如下:

18030   AAJ51   FTO rs9939609   C__30090620_10  A   T
18030   AAJ51   CAT rs1001179   C__11468118_10  C   C
18030   AAJ51   CCL2    rs1024611   C___2590362_10  G   G
18030   AAJ51   TAS2R38 rs10246939  C___9506826_10  C   C
20287   AAJ51   FTO rs9939609   C__30090620_10  A   T
20287   AAJ51   CAT rs1001179   C__11468118_10  C   C
20287   AAJ51   CCL2    rs1024611   C___2590362_10  A   G
20287   AAJ51   TAS2R38 rs10246939  C___9506826_10  T   T

第 2 列、第 3 列第 4 列和第 5 列是恒定的并重复。

变量是第 1 列、第 6 列和第 7 列。

我想用这种方式转置数据:

        FTO       CAT       CCL2        TAS2R38
        rs9939609 rs1001179 rs1024611   rs10246939
18030   AT        CC        GG          AT
20287   AT        CC        AG          TT

虽然示例显示每个 ID 有 4 行(第一列中的 5 位数字是 ID),但实际文件每个 ID 有 128 行,因此执行匹配或正则表达式不切实际,并且更喜欢迭代行数。

我在converting n number of rows 上看到了这个例子,但我不确定如何修改这个应用程序。

更新:CRLF 结尾可能会导致格式问题,可以使用 dos2unix 等工具解决此问题

【问题讨论】:

    标签: awk


    【解决方案1】:

    GNU Awk 解决方案:

    awk '{ 
             if (!keys[$3]++) { b[++c] = $3; row1 = row1 OFS $3; row2 = row2 OFS $4 }
             line = groups[$1][$3];
             groups[$1][$3] = (line == ""? $6$7: line OFS $6$7) 
         }
         END{ 
             print row1 ORS row2; 
             for (i in groups) {
                 r = i; 
                 for (j in b) r = r OFS groups[i][b[j]];
                 print r 
             } 
         }' OFS='\t' file | column -txn
    

    输出:

           FTO        CAT        CCL2       TAS2R38
           rs9939609  rs1001179  rs1024611  rs10246939
    18030  AT         CC         GG         CC
    20287  AT         CC         AG         TT
    

    【讨论】:

    • 感谢 Roman,我无法理解最后一行并实施您的解决方案。你能解释一下最后一行吗
    • @gungu,最后一行是}' OFS='\t' file | column -txn 或者你的意思是另一个?
    • 是的,}' OFS='\t' 文件 |列 -txn 。 'file' 是被转置的文件,'column' 是生成的新文件吗?
    • @gungu, file 是输入文件,但column 是一个命令行工具,用于制作格式漂亮的列输出。感谢column,您看到了良好的对齐输出
    • 我得到一个“列:非法选项--n”
    【解决方案2】:

    尝试使用 last_seen 变量和数组。

    1. 当 last_seen 变量发生变化时,将数组输出为一行。
    2. 将当前行的值存储在数组中。

    【讨论】:

    • 感谢赞的建议。能举个例子吗?
    猜你喜欢
    • 2019-02-22
    • 2014-10-05
    • 1970-01-01
    • 2015-06-21
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多