【问题标题】:Linux transpose long format to wide formatLinux 将长格式转为宽格式
【发布时间】:2016-06-14 07:48:13
【问题描述】:

我希望使用 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,每个 ID 超过 10,000 行,但如果需要可以拆分成更小的文件。 我以前的代码会转置行和列,但不知道如何从长格式中获取它。

【问题讨论】:

  • 为什么您的标题行中没有1_23452_232452_2345 是从哪里出现的? 112113 行从哪里出现在您的输出中(如果答案来自您的输入文件,则编辑您的示例输入文件以包含它们)?

标签: python linux awk transpose


【解决方案1】:

知道如何根据您发布的输入文件生成您发布的输出,但也许这会帮助您走上正轨:

$ 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

【讨论】:

    【解决方案2】:

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

    $ 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
    

    【讨论】:

      猜你喜欢
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多