我有下表:
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'
,但是我不知道有什么命令可以填充表tbh。
答案 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