填写等级表

时间:2018-09-13 13:24:37

标签: bash awk sed

我有下表:

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

这是一个制表符分隔的表,在itemdesc之间是两个空白字符。

现在,我想用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',但是我不知道有什么命令可以填充表tbh。

1 个答案:

答案 0 :(得分:1)

$ 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