2017-02-10 213 views
0

我知道如何在R中做到这一点,但不幸的是我的数据集太大,所以我试图使用shell将数据集从长格式转换为宽格式。unix convert long to wide

当前格式是这样的:

Name1 A 3 
Name2 A 6 
Name3 A 10 
Name3 B 2 
Name4 A 4 
Name5 B 1 

我想将它转换为宽幅,使得第二列成为新列和第三列成为计数。如果没有谷,我想在这种地方插入一个0:

Name A B 
Name1 3 0 
Name2 6 0 
Name3 10 2 
Name4 4 0 
Name5 0 1 

从我有限的Linux知识,我在网上搜索我真的不知道该如何处理这个。

我试图解决这个问题的一件事是使用grep将文件分为两个单独的文件,然后尝试长连接。

grep A file | sort -k 1 > file_A 
grep B file | sort -k 1 > file_B 
join -o '0,1.2,1.3,2.2,2.3' -e "0" -a1 -a2 <(sort -k 1 file_A) <(sort -k 1 file_B) > output 

出现如果我只是运行join命令工作。然而,当我尝试直接输出到一个文件,我得到了以下错误消息:

join: /dev/fd/63:63: is not sorted: Name4 A 83 
join: /dev/fd/62:15: is not sorted: Name5 B 3 

所有我看过网上表示当文件没有适当的排序出现这个错误,但实际上我觉得我按第1列对它们进行两次排序。

任何关于从宽格式到长格式的最佳方式的想法或者如何麻烦我制作汇总表的尝试都将不胜感激。谢谢。

回答

2

这是的一个工具,而不是join。你想有一个二维数据结构来保存信息。我使用GNU awk以排序的顺序遍历数组键。

gawk ' 
    {val[$1][$2] = $3} 
    END { 
     PROCINFO["sorted_in"] = "@ind_str_asc" 
     print "NAME A B" 
     for (name in val) 
      print name, 0+val[name]["A"], 0+val[name]["B"] 
    } 
' file 

我将该值加到零,以便将未设置的数组元素视为数字零而不是空字符串。

+0

非常感谢!我以前从未使用过gawk,但这个脚本完美无缺!使用加入是我雹子玛丽试图尝试使用我感觉舒适的命令创造性地思考,但是这个gawk解决方案要好得多! – user4670961