使用awk或其他命令聚合和处理重复项

时间:2013-10-14 17:25:28

标签: bash awk aggregate

我有这个任务。杂志文章涵盖各种主题。我们分配一个数值来反映特定主题和文章之间的关系(链接)的强度。将原始数据重新格式化为更方便的演示文稿,如下所示。

INPUT DATA (tab-separated)

Theme  Article  Link_strength
A      aaa      2
A      bbb      8
B      bbb      7
C      aaa      3      

OUTPUT DATA

Article Theme_A Theme_B Theme_C
aaa     2       0       3
bbb     8       7       0

我试过R,但数据大小是个问题 所以,我需要弄清楚awk命令可能会有所帮助。但是怎么做?

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

awk -f format.awk input.txt

其中input.txt是您的输入数据文件,format.awk

BEGIN {
    OFS="\t"
}
NR > 3 {
    themes[$1]++
    ka[$2]++
    art[$2,$1]=$3
}

END {
    printf "%s%s", "Article",OFS
    for (j in themes) {
        printf "Theme_%s%s", j, OFS
    }
    printf "\n"
    for (i in ka) {
        printf "%s%s", i, OFS
        for (j in themes) {
            printf "%d%s", art[i,j],OFS
        }
        printf "\n"
    }
}

答案 1 :(得分:0)

R中的解决方案:

library(reshape)
cast(df,Article ~ Theme,fill=0)

输出

  Article A B C
1     aaa 2 0 3
2     bbb 8 7 0

使用reshape2代替相同的事情:

library(reshape2)
dcast(df,Article ~ Theme,value.var='Link_strength',fill=0)