2012-07-18 31 views
17

मेरे पास डोमेन नामक एक फ़ाइल है जिसमें कुछ डोमेन शामिल हैं। उदाहरण के लिए:नियमित अभिव्यक्तियों में अजीब चर का उपयोग कैसे करें?

google.com 
facebook.com 
... 
yahoo.com 

और मैं साइट जो कुछ साइट्स के यूआरएल और संख्या शामिल नामक एक और फ़ाइल है। उदाहरण के लिए:

image.google.com 10 
map.google.com  8 
... 
photo.facebook.com 22 
game.facebook.com 15 
.. 

अब मैं प्रत्येक डोमेन के यूआरएल नंबर को गिनने जा रहा हूं। उदाहरण के लिए: google.com में 10 + 8 है।

BEGIN{ 
    while(getline dom < "./domain" > 0) { 
    domain[dom]=0; 
    } 
    for(dom in domain) { 
    while(getline < "./site" > 0) { 
     if($1 ~/$dom$) #if $1 end with $dom { 
     domain[dom]+=$2; 
     } 
    } 
    } 
} 

लेकिन कोड if($1 ~/$dom$) नहीं चलता है कि मैं चाहता हूँ: तो मैं इस तरह एक awk पटकथा लिखी। क्योंकि नियमित अभिव्यक्ति में परिवर्तनीय $ dom शब्दशः समझाया गया था। तो, पहला सवाल यह है:

क्या नियमित अभिव्यक्ति में परिवर्तनीय $dom का उपयोग करने का कोई तरीका है?

फिर, जैसा कि मैं लेखन स्क्रिप्ट के लिए नया हूँ

वहाँ समस्या मैं हल करने के लिए किसी भी बेहतर तरीका है? एक ऑपरेटर चर dom

दूसरे में संग्रहीत स्तंभ संख्या का मान प्राप्त करने के रूप में विचार करें $, awk क्या // के बीच है अंतर्वेशन नहीं होगा -

उत्तर

15

सबसे पहले, चर dom$dom नहीं है - वह वहां बस एक स्ट्रिंग है।

if (match($1, dom "$")) {...} 

मैं की तरह एक समाधान कोड होगा::

awk ' 
    FNR == NR {domain[$1] = 0; next} 
    { 
    for (dom in domain) { 
     if (match($1, dom "$")) { 
     domain[dom] += $2 
     break 
     } 
    } 
    } 
    END {for (dom in domain) {print dom, domain[dom]}} 
' domain site 
+0

अनुरूप के खिलाफ मेल खाते हैं $ के साथ, यह बेहतर समझाया गया है (आईएमओ) अजीब में $ साधन फ़ील्ड के रूप में, इसलिए $ dom का मतलब फ़ील्ड का मतलब है जो भी डोम का मान है। अजीब में चर का उपयोग बिना छेड़छाड़ और $ के बिना किया जाता है। यह खोल नहीं है! –

1

एक तरह से एक का उपयोग कर

आप match() समारोह जहां 2 तर्क एक स्ट्रिंग है नियमित अभिव्यक्ति के रूप में व्यवहार किया जाता है हो सकता है चाहता हूँ awk स्क्रिप्ट:

BEGIN { 
    FS = "[. ]" 
    OFS = "." 
} 

FNR == NR { 
    domain[$1] = $0 
    next 
} 

FNR < NR { 
    if ($2 in domain) { 
     for (i = 2; i < NF; i++) { 
      if ($i != "") { 
       line = (line ? line OFS : "") $i 
      } 
     } 
     total[line] += $NF 
     line = "" 
    } 
} 

END { 
    for (i in total) { 
     printf "%s\t%s\n", i, total[i] 
    } 
} 

भागो की तरह:

awk -f script.awk domain.txt site.txt 

परिणाम:

facebook.com 37 
google.com 18 
+0

यदि आप 'site' फ़ाइल में" first.second.example.com "जैसे डोमेन प्राप्त करते हैं तो यह दृष्टिकोण काम नहीं करेगा। –

+0

@glennjackman, हाँ आप सही हैं। मैंने इस पर विचार नहीं किया :-( – Steve

1

आप स्पष्ट रूप से domain में एक बार site फ़ाइल को पढ़ने के लिए, एक बार प्रवेश प्रति नहीं चाहते हैं। फिक्सिंग, हालांकि, मामूली है।

समान रूप से, awk में चर (क्षेत्रों $0 .. $9, आदि के अलावा अन्य) $ उपसर्ग के साथ नहीं हैं। विशेष रूप से, $dom वैरिएबल dom द्वारा पहचाना गया फ़ील्ड नंबर है (आमतौर पर, यह 0 होने जा रहा है क्योंकि डोमेन स्ट्रिंग किसी अन्य नंबर पर कनवर्ट नहीं होते हैं)।

मुझे लगता है कि आपको site फ़ाइल से डेटा को पढ़ने के लिए एक तरीका खोजने की आवश्यकता है। मुझे यकीन नहीं है कि आपको देश डोमेन जैसे bbc.co.uk के साथ-साथ GTLDs (google.com आदि) जैसी साइटों से निपटने की आवश्यकता है। मान लें कि आप देश डोमेन के साथ काम नहीं कर रहे हैं, तो आप इस का उपयोग कर सकते हैं:

BEGIN { 
    while (getline dom < "./domain" > 0) domain[dom] = 0 
    FS = "[ .]+" 
    while (getline < "./site" > 0) 
    { 
     topdom = $(NF-2) "." $(NF-1) 
     domain[topdom] += $NF   
    } 
    for (dom in domain) print dom " " domain[dom] 
} 

दूसरा while पाश में, वहाँ NF क्षेत्रों रहे हैं; $NF में गिनती है, और $1 .. $(NF-1) डोमेन के घटक शामिल हैं। तो, topdom शीर्ष डोमेन नाम वाला होता है, जिसका उपयोग पहले लूप में शुरू किए गए सरणी में अनुक्रमणित करने के लिए किया जाता है।

सवाल (ऋण डॉट्स की तर्ज) में डेटा को देखते हुए उत्पादन होता है: यदि आप // regex मार्कर का उपयोग नहीं करते

yahoo.com 0 
facebook.com 37 
google.com 18 
17

awk एक चर के खिलाफ मिलान कर सकते हैं।

if ($0 ~ regex){ print $0; }

इस मामले में, एक स्ट्रिंग के रूप में आवश्यक regex का निर्माण

regex = dom"$" 

फिर कैसे चर पहले से जुड़ा हुआ नहीं कर रहे हैं के बारे में बात उन सभी regex चर

if ($1 ~ regex) { 
    domain[dom]+=$2; 
} 
संबंधित मुद्दे