如何使用awk将重复的行集转换为列

如何使用awk将重复的行集转换为列,awk,Awk,我创建了一个文本文件,其中包含以下格式的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

我创建了一个文本文件,其中包含以下格式的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行,因此执行匹配或正则表达式将不实际,并且更喜欢在多行上迭代的方法

我在上看到了此示例,但不确定如何修改此应用程序


更新:CRLF结尾可能会导致格式问题,可以使用dos2unix之类的工具来解决。请尝试使用最后一个变量和数组

当最后一个变量更改时,将数组作为行输出。 在数组中存储当前行的值。 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,我无法理解最后一行并实现您的解决方案。你能解释一下最后一个问题吗line@gungu,最后一行是}'OFS='\t'file | column-txn,或者您指的是另一行?是的,}'OFS='\t'file | column-txn。“file”是正在转换的文件,“column”是生成的新文件吗?@gungu,file是输入文件,但column是一个命令行工具,可以生成格式非常好的列输出。多亏了column,您看到了良好的对齐输出。我得到了一个column:非法选项-n