从CSV文件获取特定输入的B树

时间:2013-12-17 02:57:46

标签: mysql bash shell sed awk

我有一个包含以下内容的CSV文件

100001,0,top
100002,100001,left
100003,100001,middle
100004,100001,right
100005,100002,left
100006,100002,right
100007,100002,middle
100008,100003,left
100013,100003,right
100011,100003,middle
100014,100003,left
100025,100003,right
100020,100003,middle

假设第一个字段是memberID,第二个是memberof(指上述某些记录的同一文件的memberID)&第三个位置,即左或中或右 这就像顶部的B-tree Raw数据100001,它有左中分支和右分支

我的预期输出是

level1
100001(parent),100002,100004,100003

level2
100002(parent),100005,100006,100007
100004(parent),100014,100025,100029
100003(parent),100009,100013,100011

level4
......

输入文件中可以有超过100条记录,因此如果从顶部开始搜索,则可以有超过5个级别。

输出应该是低于输入值的层次结构的成员。 (如果我给100003它应该给予其下面的成员而不是上面)

我尝试在mysql中插入并尝试递归查询它变得更加复杂和耗时。

我相信awk& sed命令可以提供帮助,但我没有太多的动手和帮助。练习那些。

我正在寻找可以实现此目的的awksed命令或bash或shell脚本。

它首先像二进制搜索,然后从输入中获取B树。

为了更好地理解,请查看图表(对于每个成员,将在左下方中间但不超过3个成员在下面的水平)

我的失败尝试使用mysql的代码1

#!/bin/bash

input=$1;

left='';
middle='';
right='';
level=0
function getchild () {

left=$(mysql -uroot -p"passwd" -Ddbname -s -N -e "select mid from mtree where pid=$1 and pos='left'");
middle=$(mysql -uroot -p"passwd" -Ddbname -s -N -e "select mid from mtree where pid=$1 and pos='middle'");
right=$(mysql -uroot -p"passwd" -Ddbname -s -N -e "select mid from btree where pid=$1 and pos='right'");
#level=$(($level+1));
#return $level;

}

getchild $input;
echo "$input,$left,$middle,$right"

我的失败代码2与grep

#!/bin/bash

input=$1;

left='';
middle='';
right='';
level=0
function getchild () {

left=$(grep ",$1,left" filename);
middle=$(grep ",$1,middle" filename);
right=$(grep ",$1,right" filename);

}

getchild $input;
echo "$input,$left,$middle,$right"

现在我正在凝视我怎样才能得到每个左中间和右边的子级别?对(递归,直到没有元素下降)

diagram

提前致谢

1 个答案:

答案 0 :(得分:1)

你可以从这开始:

 awk -F , '{a[$2]=a[$2]==""?$1:a[$2] FS $1}END{for (i in a) print i,"(parent),",a[i]}' infile.csv

结果:

0 (parent), 100001
100001 (parent), 100002,100003,100004
100002 (parent), 100005,100006,100007
100003 (parent), 100008,100013,100011,100014,100025,100020