2012-03-14 10 views
12

मैं इनपुट फ़ाइल $ 3 स्तंभ मान को बदलने के लिए करता है, तो $ 3 है> 100 कोशिश कर रहा हूँ मैंने कोशिश में एक स्तंभ मान लिखें:AWK: की जगह और इनपुट फ़ाइल

awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat 

यह करने के लिए सही परिवर्तन आउटपुट stdout लेकिन, मुझे इनपुट फ़ाइल (test.stat) को लिखने के लिए परिवर्तन की आवश्यकता है, जैसे कि शेष फ़ील्ड/रिकॉर्ड्स के मान अपरिवर्तित रहते हैं। कोई उपाय?

धन्यवाद। एक और मुद्दा उठ गया है। मैं एक "काउंटर" चर जिसका योग की जरूरत है अंत ब्लॉक में मुद्रित करने के लिए है, मैं करने की कोशिश की:

awk 'BEGIN {FS="\t",counter=0} 
{if($3 > 100) $3=$3/100;print else counter++} 
END{print counter}' test.stat > ... 

अब, केवल काउंटर मूल्य फाइल करने के लिए लिखा गया है और न $ 3 मूल्यों हो जाता है। मैं दो आउटपुट को कैसे अलग कर सकता हूं ताकि एक फ़ाइल को संशोधित कर सके और दूसरा रीड कमांड का उपयोग करके बैश वैरिएबल के रूप में सहेजा जा सके। धन्यवाद।

उत्तर

9

Awk चीजों को संपादित करने के लिए डिज़ाइन नहीं किया गया है। यह डेटा को संसाधित करने और इसे stdout (या दूसरी फ़ाइल) में लिखने के लिए डिज़ाइन किया गया है। आप कुछ इस तरह कर सकते हैं:

$ awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat > test.stat.new \ 
    && mv test.stat test.stat.old && mv test.stat.new test.stat 
+0

काम करना चाहिए, धन्यवाद, एडब्ल्यूके के पुनः से अवगत नहीं था स्ट्रिक्शन –

+0

लेकिन, यह स्वरूपण को संरक्षित नहीं करता है, यानी, मेरे इनपुट फ़ील्ड्स टैब द्वारा अलग किए जाते हैं, लेकिन संपादित रिकॉर्ड में फ़ील्ड से अलग फ़ील्ड होते हैं। इसके अलावा, मुद्रण से पहले फ्लोट को 2 डीपी तक कैसे सीमित करें। धन्यवाद –

+0

पता लगाया। धन्यवाद –

2

जहाँ तक मुझे पता है कि awk में sed के रूप में संपादन स्थान नहीं है (-i स्विच के माध्यम से)।

सरल समाधान, निश्चित रूप से, एक temp फ़ाइल का उपयोग करना और मूल फ़ाइल को बाद में ओवरराइट करना है। यह समाधान comp.lang.awk में भी अनुशंसित है।

कठिन समाधान awk सरणी में परिवर्तनों को सहेजना है और END ब्लॉक जोड़ें जो सरणी की मूल फ़ाइल में सामग्री को डंप करता है।

2

बनाने के अपने आदेश अधिक awk की तरह:

awk -F '\t' '$3 > 100 {$3 = $3/100} {print}' test.stat 

फ़ाइल को अधिलेखित करने के लिए, आप एक अस्थायी फ़ाइल

f=$(mktemp) 
cp test.stat test.stat.bak$(date +%s) ;# if you want a backup copy 
awk '...' test.stat > "$f" && mv "$f" test.stat 
2
awk 'BEGIN {FS="\t"} {if($3 > 100) $3=$3/100;print}' test.stat > /tmp/tmp.stat && mv /tmp/tmp.stat test.stat 
को लिखने की ज़रूरत

यह

+0

धन्यवाद। लेकिन, यह स्वरूपण को संरक्षित नहीं करता है, यानी, मेरे इनपुट फ़ील्ड टैब द्वारा अलग किए जाते हैं, लेकिन संपादित रिकॉर्ड में फ़ील्ड से अलग फ़ील्ड होते हैं। इसके अलावा, मुद्रण से पहले फ्लोट को 2 डीपी तक कैसे सीमित करें। धन्यवाद –

+0

पता लगाया। धन्यवाद –

+0

@ शूवो-शम्स - आउटपुट विभाजक डिफ़ॉल्ट रूप से स्थान है, ओएफएस, ई के माध्यम से बदला जा सकता है। जी। 'awk 'BEGIN {FS =" \ t "; OFS = "\ t"} {...} ' – citrin