亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 2160 | 回復(fù): 17
打印 上一主題 下一主題

[文本處理] 用shell / awk / sed能實(shí)現(xiàn)級(jí)聯(lián)樹狀結(jié)構(gòu)么 [復(fù)制鏈接]

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-19 11:07:52
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-08-31 21:52 |只看該作者 |倒序?yàn)g覽
比如下面的文件


  1. id pid name
  2. 2 1 d
  3. 1 0 a
  4. 3 1 b
  5. 4 2 c
  6. 5 3 e
復(fù)制代碼


id是不重復(fù)的,pid是parent的id,要求遍歷所有的父子節(jié)點(diǎn),實(shí)現(xiàn)如下的輸出,用shell 或者awk / sed適合么?


  1. 0->1->2->4 a,d,c
  2. 0->1->3->5 a,b,e
復(fù)制代碼

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [報(bào)告]
發(fā)表于 2016-08-31 23:55 |只看該作者
回復(fù) 1# rm-rf


$ cat FILE

id pid name
2 1 d
1 0 a
3 1 b
4 2 c
5 3 e
6 2 g
7 1 x
8 7 j
9 7 k
10 9 m
12 3 f

$ awk 'function child(v,cs,as,x){if(c[v]==""){sub(",$","",as);print cs v,as;return}while(x=index(c[v]," ")){cx=substr(c[v],1,x-1);child(cx,cs v"->",as a[v,cx]",");c[v]=substr(c[v],x+1)}child(c[v],cs v"->",as a[v,c[v]]",")}/^[0-9]/{c[$2]=c[$2]d[$2]$1;d[$2]=" ";a[$2,$1]=$3}END{child(0)}' FILE
0->1->2->4 a,d,c
0->1->2->6 a,d,g
0->1->3->5 a,b,e
0->1->3->12 a,b,f
0->1->7->8 a,x,j
0->1->7->9->10 a,x,k,m

論壇徽章:
307
程序設(shè)計(jì)版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
3 [報(bào)告]
發(fā)表于 2016-09-01 02:10 |只看該作者
找了一條引用鏈:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. readline;
  5. my @aVals = map {[split]} <>;
  6. my ($id, $pid, $name) = @{$aVals[0]};
  7. while (grep {$id == $aVals[$_][1] ? do {($id, $pid, $name) = @{$aVals[$_]}; 1} : 0} 1 .. $#aVals){}
  8. my ($offset, @aData);
  9. unshift (@{$aData[0]}, $id);
  10. unshift (@{$aData[1]}, $name);
  11. while (grep {$pid == $aVals[$_][0] ? do {$offset = $_; 1} : 0} 0 .. $#aVals){
  12.     ($id, $pid, $name) = @{$aVals[$offset]};
  13.     unshift (@{$aData[0]}, $id);
  14.     unshift (@{$aData[1]}, $name);
  15. }

  16. print join ("->", $pid, @{$aData[0]}), "\t", join (",", @{$aData[1]}), "\n";
復(fù)制代碼

perl abc.pl a
---------------------------------------------------
0->1->2->4      a,d,c

論壇徽章:
307
程序設(shè)計(jì)版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
4 [報(bào)告]
發(fā)表于 2016-09-01 02:33 |只看該作者
本帖最后由 sunzhiguolu 于 2016-09-01 02:55 編輯

  理解的有偏差,,,


   





論壇徽章:
6
15-16賽季CBA聯(lián)賽之新疆
日期:2016-03-22 22:34:5915-16賽季CBA聯(lián)賽之山東
日期:2016-04-11 09:08:41程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-28 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-19 06:20:00每日論壇發(fā)貼之星
日期:2016-07-19 06:20:0015-16賽季CBA聯(lián)賽之青島
日期:2016-07-20 22:44:17
5 [報(bào)告]
發(fā)表于 2016-09-01 06:10 |只看該作者
$_ = do {$/=undef; <>};        #read file
s/^.+\n//;        #remove header
s/^(\d+) (\d+) /$2->$1 /gm;                #-> relationship
$tree = $_;        #keep a copy of relationship
1 while (s/^([1-9]\d*)->(.+?) /($id, $v) = ($1,$2);  $tree =~ m:^(.+)->$id (\w+):m;  "$1->$id->$v $2,"/mge);        #create a full list
for $i ($tree =~ /^(\d+)/mg ) { s/^.+->$i .+\n//gm };  #remove lines ends with pids
print;

_____
$>  cat aa|perl aa.pl
0->1->2->4 a,d,c
0->1->3->5 a,b,e
0->1->2->6 a,d,g
0->1->7->8 a,x,j
0->1->7->9->10 a,x,k,m
0->1->3->12 a,b,f

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-19 11:07:52
6 [報(bào)告]
發(fā)表于 2016-09-01 10:48 |只看該作者
回復(fù) 2# jason680

太給力了,超贊!

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
7 [報(bào)告]
發(fā)表于 2016-09-01 11:34 |只看該作者
回復(fù) 1# rm-rf


  1. echo 'id pid name
  2. 2 1 d
  3. 1 0 a
  4. 3 1 b
  5. 4 2 c
  6. 5 3 e'|awk '
  7. function ss(x,l,n,t){
  8.   if(length(a[x])){
  9.     l=l?l"->"x:x
  10.         t = n
  11.     for(j in a[x]){
  12.       n=n?n","a[x][j]:a[x][j]
  13.       ss(j,l,n,t)
  14.           n=t
  15.     }
  16.   }else{
  17.     print l"->"x, n;
  18.         l=n=""
  19.   }
  20. }
  21. NR>1{a[$2][$1]=$3}
  22. END{for(i in a){ss(i,"","","")}}
  23. '
  24. 0->1->2->4 a,d,c
  25. 0->1->3->5 a,b,e
  26. 1->2->4 d,c
  27. 1->3->5 b,e
  28. 2->4 c
  29. 3->5 e
復(fù)制代碼

論壇徽章:
2
技術(shù)圖書徽章
日期:2013-12-17 13:52:152015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-07-19 11:07:52
8 [報(bào)告]
發(fā)表于 2016-09-01 22:31 |只看該作者
回復(fù) 2# jason680

大俠,這個(gè)腳本非常經(jīng)典,感謝。能更加一步,判斷里面的cycle么?比如出現(xiàn)cycle只打印第一次遍歷出來的即可


  1. id pid name
  2. 2 1 d
  3. 1 0 a
  4. 3 1 b
  5. 4 2 c
  6. 9 10 p
  7. 5 3 e
  8. 6 2 g
  9. 7 1 x
  10. 8 7 j
  11. 9 7 k
  12. 2 6 m
  13. 12 3 f
復(fù)制代碼
結(jié)果為:

  1. 0->1->2->4 a,d,c
  2. 0->1->2->6 a,d,g
  3. 0->1->3->5 a,b,e
  4. 0->1->3->12 a,b,f
  5. 0->1->7->8 a,x,j
  6. 0->1->7->9 a,x,k
復(fù)制代碼
其中0->1->2->6這個(gè)鏈表cycle了,只打印第一次遍歷到的情況

論壇徽章:
6
15-16賽季CBA聯(lián)賽之新疆
日期:2016-03-22 22:34:5915-16賽季CBA聯(lián)賽之山東
日期:2016-04-11 09:08:41程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-28 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-19 06:20:00每日論壇發(fā)貼之星
日期:2016-07-19 06:20:0015-16賽季CBA聯(lián)賽之青島
日期:2016-07-20 22:44:17
9 [報(bào)告]
發(fā)表于 2016-09-01 23:05 |只看該作者
$>  cat bb|perl aa.pl
0->1->2->4 a,d,c
0->1->3->5 a,b,e
0->1->7->8 a,x,j
0->1->7->9 a,x,k
0->1->3->12 a,b,f
$>  cat aa.pl
$_ = do {$/=undef; <>}; #read file
s/^.+\n//;      #remove header
s/^(\d+) (\d+) /$2->$1 /gm;             #-> relationship
$tree = $_;     #keep a copy of relationship
while (s/^([1-9]\d*)->(.+?) /($id, $v) = ($1,$2);  $tree =~ m:^(.+)->$id (\w+):m;  "$1->$id->$v $2,"/mge)       #create a full list
{
  s/.*(\d+)->.*\1.+\n//; #Remove cycles
}
for $i ($tree =~ /^(\d+)/mg ) { s/^.+->$i .+\n//gm };  #remove lines ends with pids
print;

論壇徽章:
145
技術(shù)圖書徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11獅子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龍
日期:2014-01-08 15:26:12技術(shù)圖書徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [報(bào)告]
發(fā)表于 2016-09-02 10:17 |只看該作者
本帖最后由 jason680 于 2016-09-02 10:27 編輯

回復(fù) 8# rm-rf

It's hard to know what's happened

"id是不重復(fù)的,pid是parent的id..."

id pid name
2 1 d
6 2 g
2 6 m

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP