मेरे पास लगभग 1000 फाइलें हैं जिनमें रासायनिक संरचनाओं के xyz कार्टेशियन निर्देशांक हैं, नीचे एक नमूना प्रदान किया गया है
Re -0.87242200 -0.87371100 0.24194200
Re -1.38612300 1.83520600 0.44292100
Re 1.78955700 -0.15746900 0.71425500
मैं जो करना चाहता हूं, अधिमानतः 'फॉर' लूप के माध्यम से, री की दूसरी मुठभेड़ के बाद एक अतिरिक्त लाइन जोड़ना है, उस लाइन में लाइन के पहले स्थान पर एक प्रतीक 'एच' जोड़ें फिर xyz निर्देशांक परिचय करें फॉर्म 1.5 + X 1.5 + Y 1.5 + Z, जहां XY और Z दूसरे रे के निर्देशांक हैं। ये xyz निर्देशांक नई लाइन (क्रमशः X, Y और Z के लिए) में 20, 40 और 60 की स्थिति में होने चाहिए।
2 जवाब
यह अवाक (या पर्ल या पायथन) के लिए एक कार्य है। यह सैड के लिए उपयुक्त नहीं है क्योंकि यह अंकगणित नहीं कर सकता है; यह वास्तव में बैश के लिए उपयुक्त नहीं है क्योंकि यह केवल पूर्णांक अंकगणित करता है। यह कोर्न शेल में किया जा सकता था क्योंकि यह फ्लोटिंग-पॉइंट अंकगणित का समर्थन करता है, लेकिन अवाक संभवतः कार्य के लिए सबसे अच्छा उपकरण है।
नमूना डेटा में, सभी लाइनें Re
शुरू होती हैं। इस तरह के डेटा के लिए, यह पर्याप्त है:
awk '/^Re / { print
if (++count == 2)
printf("%-18s %-19s %-19% %s\n", "H", $2+1.5, $3+1.5, $4+1.5) }'
यदि किसी पंक्ति के प्रारंभ में अन्य चिह्न हैं जिन्हें मुद्रित करने की आवश्यकता है, तो आपको इसकी आवश्यकता है:
awk '/^Re / { print
if (++count == 2)
printf("%-18s %-19s %-19% %s\n", "H", $2+1.5, $3+1.5, $4+1.5)
next }
{ print }'
अगला ट्रेलिंग { print }
को छोड़ देता है जो किसी भी अन्य लाइनों को प्रोसेस करता है। उस { print }
को 1
या किसी अन्य गैर-शून्य (सत्य) मान के लिए संक्षिप्त किया जा सकता है जो डिफ़ॉल्ट क्रिया को ट्रिगर करता है, जिसका नाम print
है। अर्धविरामों के एक जोड़े के साथ, या तो स्क्रिप्ट को एक पंक्ति में निचोड़ा जा सकता है, लेकिन मुझे लगता है कि कई लाइनों की स्पष्टता बेहतर है।
awk '/^Re / { print; if (++count == 2) printf("%-18s %-19s %-19% %s\n", "H", $2+1.5, $3+1.5, $4+1.5); next } { print }'
यदि आपको मुद्रित स्थानों की संख्या को नियंत्रित करने की आवश्यकता है, तो आप %-19s
और %s
रूपांतरण विनिर्देशों के बजाय %-19.8f
या %+-19.8f
का उपयोग कर सकते हैं।
निम्नलिखित awk
स्क्रिप्ट को देखते हुए:
BEGIN { count = 0 }
/^\<Re\>/ { x=$2; y=$3; z=$4;
count++;
print;
}
count == 2 { printf "%-18s %-19s %-17s %s\n", "H", 1.5+x, 1.5+y, 1.5+z }
आप इसे कई फाइलों पर चला सकते हैं:
for f in file*.txt; do
gawk -i inplace -f add-H.awk -- "$f"
done
ध्यान दें कि इसके लिए GNU awk के हाल के संस्करण की आवश्यकता है, जो कि inplace modification का समर्थन करता है (