Awk का उपयोग करके किसी फ़ाइल को इन-प्लेस में कैसे बदलें? (जैसा कि "sed -i" के साथ)


11

मेरे पास एक awkस्क्रिप्ट है new.awk:

 BEGIN { FS=OFS="," }
 NR==1 {
for (i=1; i<=NF; i++) {
    f[$i] = i
}
   } 
  NR > 1 {
 begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"])))
 endSecs = begSecs + $(f["TotalDuration"])
 $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
 }
 { print }

मैं इसे शेल में बुला रहा हूं

awk new.awk sample.csv

... लेकिन मैं टर्मिनल में बदलाव देख सकता हूं। उपयोग करते समय फ़ाइल में परिवर्तन कैसे करें sed -i?

जवाबों:


16

जीएनयू awk(आमतौर पर लिनक्स सिस्टम पर पाया जाता है), संस्करण 4.1.0 के बाद से, कमांड लाइन पर या उसके awkसाथ एक " स्रोत लाइब्रेरी" को शामिल करने में सक्षम है । GNU के साथ वितरित होने वाले स्रोत पुस्तकालयों में से एक को कहा जाता है :-i--includeawkinplace

$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello

जैसा कि आप देख सकते हैं, यह awkकोड के आउटपुट को इनपुट फ़ाइल से बदल देता है। यह कहते हुए लाइन thereनहीं रखी जाती है क्योंकि यह प्रोग्राम द्वारा आउटपुट नहीं किया गया है।

awkकिसी फ़ाइल में स्क्रिप्ट के साथ , आप इसका उपयोग करेंगे

awk -i inplace -f script.awk datafile

यदि awkचर INPLACE_SUFFIXस्ट्रिंग पर सेट है, तो लाइब्रेरी फ़ाइल नाम के साथ प्रत्यय के रूप में मूल फ़ाइल का बैकअप बनाएगी।

awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile

यदि आपके पास कई इनपुट फाइलें हैं, तो प्रत्येक फाइल व्यक्तिगत रूप से इन-प्लेस हो सकती है। लेकिन आप inplace=0उस फ़ाइल से पहले कमांड लाइन का उपयोग करके किसी फ़ाइल (या फ़ाइलों का एक सेट) के लिए इन-प्लेस संपादन बंद कर सकते हैं :

awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4

उपरोक्त आदेश में, file3इन-प्लेस संपादित नहीं किया जाएगा।


एक ही फ़ाइल के अधिक पोर्टेबल "इन-प्लेस एडिट" के लिए, उपयोग करें

tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"

यह इनपुट फ़ाइल को एक अस्थायी स्थान पर कॉपी कर देगा, फिर awkमूल फ़ाइल नाम पर रीडायरेक्ट करते हुए अस्थायी फ़ाइल पर कोड लागू करेगा ।

इस क्रम में संचालन करना ( awkअस्थायी फ़ाइल पर चलना , मूल फ़ाइल पर नहीं) यह सुनिश्चित करता है कि मूल फ़ाइल का मेटा-डेटा (अनुमतियाँ और स्वामित्व) संशोधित नहीं है।


4

इसे इस्तेमाल करे।

awk  new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
  • एक अस्थायी फ़ाइल में आउटपुट पुनर्निर्देशित करें।
  • फिर अस्थायी फ़ाइल की सामग्री को मूल फ़ाइल में ले जाएं।

1
यदि आप awk inplace source कोड को देखते हैं, तो यह ठीक यही करता है: एक अस्थायी फ़ाइल बनाता है, वहाँ stdout को पुनर्निर्देशित करता है और अंत में इसे इनपुट फ़ाइल में बदल देता है।
chx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.