首页 > 解决方案 > 填写层次表

问题描述

我有下表:

B        categoryA
C           cateogoryB
D               categoryC  descC1
E                   item1  desc1
E                   item2  desc3
E                   item3  desc4
E                   item4  desc5
E                   item5  desc6

它是一个制表符分隔的表格,介于item两个desc空白字符之间。

现在我想在 bash 中自动填写这个表,这样一个类别下面的每个选项卡都被替换为值,直到有一个新的类别。

这是我想要的输出:

E        categoryA  cateogoryB  categoryC  descC2   item1  desc1
E        categoryA  cateogoryB  categoryC  descC3   item2  desc3
E        categoryA  cateogoryB  categoryC  descC4   item3  desc4
E        categoryA  cateogoryB  categoryC  descC5   item4  desc5
E        categoryA  cateogoryB  categoryC  descC6   item5  desc6

如何使用 bash 完成此任务?

我开始将表格修改为完全制表符分隔 ( sed 's/^B /B\t/g' ko00002_mod.keg | sed 's/^C /C\t\t/g' | sed 's/^D /D\t\t\t/g' | sed 's/^E /E\t\t\t\t/g',但我不知道可以填写表格的命令。

标签: bashawksed

解决方案


$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    for (i=1; i<=NF; i++) {
        if ($i ~ /[^[:space:]]/) {
            def[i] = ($i ~ /[^[:space:]]/ ? $i : def[i])
        }
        else {
            $i = def[i]
        }
    }
}
/^E/ {
    split($(NF-1),tmp," ")
    sub(/[0-9]+$/,"",tmp[2])
    $(NF-1) = tmp[1] "  " tmp[2] (++cnt) + 1
    print
}

$ awk -f tst.awk file
E       categoryA       cateogoryB      categoryC  descC2       item1  desc1
E       categoryA       cateogoryB      categoryC  descC3       item2  desc3
E       categoryA       cateogoryB      categoryC  descC4       item3  desc4
E       categoryA       cateogoryB      categoryC  descC5       item4  desc5
E       categoryA       cateogoryB      categoryC  descC6       item5  desc6

推荐阅读