2013-10-14 27 views
1

我有一個GraphViz的文件中像這樣我要上線匹配兩個變量,看看有多少獨特的變量有

graph { 
    edge [arrowhead = none] 
    A -> B 
    B -> C 
    B -> D [ label="foobar" ]; 
    C -> A 
} 

,我想找到答案,多少個節點也有,例如在這種情況下(A,B,C,d)4. 當我堅持用1字母的節點,我使用這樣

grep -- -\> graph.gv | grep -o . | sort | grep [A-Z] | uniq | wc -l 

一個腳本,但應該我需要使用多信節點失敗。

理想我有一個非常符合

match $a -> $b ; echo $a\n $b\n | uniq | wc -l 

的東西,但我不知道如何通過SED/grep的/ awk的...無論效果最好

+0

「點」的默認輸出會生成一個新的「點」輸入文件,該文件顯式聲明每個節點;你應該能夠比從邊緣聲明中提取節點更容易處理輸出(尤其是因爲可以用'A - > B - > C'在一行中聲明多個邊緣)。 – chepner

回答

3

據我瞭解,以做到這一點,使用

awk '{ arr[$1]++; arr[$3]++ } END { print length(arr) }' infile 

它產生:

4 
一個跳過重複的散列

UPDATE:在有規律可循的部分,讓您選擇處理線的條件。正如我在編輯中看到的,可能與花括號不匹配,如:

awk '$0 !~ /[{}]/ { arr[$1]++; arr[$3]++ } END { print length(arr) }' infile 
+0

我想這隻匹配每行上的第一個和第三個單詞?這意味着它也會計算文件的「標題」。 – user1273684

+0

是的。不是你所期望的?有多少個節點? – Birei

+0

我更新了示例 – user1273684