我有一个文本文件,其中包含 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 行,因此执行匹配或正则表达式不切实际,并且更喜欢迭代多行的方法。
我在上面看到了这个例子转换 n 行数 https://stackoverflow.com/questions/25901381/convert-n-number-of-rows-to-columns-repeatedly-using-awk但我不确定如何修改此应用程序。
更新: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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)