Linux将长格式转换为宽格式

时间:2016-03-01 18:28:49

标签: python linux awk transpose

我希望使用awk语句或Python来转换长格式的文件。

我的输入文件看起来像这样;

ID Chr_Position Geno
111 1_1234 0
111 1_12345 1
111 1_2345 0
111 2_23245 2

我想要的输出(不一定需要标题)

ID 1_1234 1_12345 2_2345
111 0 1 0 2
112 1 1 1 1
113 1 1 0 2

它们是大文件,超过100,000个ID,每个超过10,000行,但如果需要可以拆分成较小的ID。 我之前的代码将转换行和列,但不知道如何从长格式中获取它。

2 个答案:

答案 0 :(得分:1)

idk如何根据您发布的输入文件生成您发布的输出,但这可能会帮助您走上正轨:

$ cat tst.awk
NR==1 { next }
$1 != prev { if (line!="") print prev line; line=""; prev=$1 }
{ line = line OFS $NF }
END { if (line!="") print prev line }

$ awk -f tst.awk file
111 0 1 0 2

答案 1 :(得分:1)

如果您的数据结构合理(相同顺序的列/行数相同,分隔符一致),您可以试试这个

$ sed 1d file | pr -4ats' ' | cut -d' ' -f1,3,6,9,12

111 0 1 0 2
112 1 0 4 3

用于测试数据文件

$ cat file

ID Chr_Position Geno
111 c1 0
111 c2 1
111 c3 0
111 c4 2
112 c1 1
112 c2 0
112 c3 4
112 c4 3