कीव के समाधान प्रत्येक शब्द में पाठ उल्टा करने के लिए लग रहा है:
tac filename | awk '{for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)}'
तुम भी पर्ल की तरह कुछ है कि निर्मित सूची-पीछे कार्यों का उपयोग कर सकते हैं। आप उदाहरण आउटपुट यह नहीं दिखाते हैं, लेकिन उनका मुख्य बिंदु फ़ंक्शन का उपयोग करना है।
आपके पास आवश्यक कोड है, आपको बस इसे थोड़ा पुनर्व्यवस्थित करने की आवश्यकता है।
cat file1
aa bb cc
foo do as
cat commandFile
function reverse(line) {
n=split(line, tmpLine)
for (j=n; j>0; j--) {
printf("%s ",tmpLine[j])
}
}
# main loop
{ a[NR]=$0 }
# print reversed array
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) }
रनिंग
awk -f commandFile file1
उत्पादन
as do foo
cc bb aa
थे मामूली परिवर्तन मैंने बनाया, n=split(line, tmpLine) ... print tmpLine[j]
का उपयोग कर के एक जोड़े, एक में इनपुट की एक पंक्ति को पार्स का एक आम तरीका है इसे प्रिंट करने के लिए कार्य करें। मुझे नहीं लगता कि $ 1 के वर्रों में एक सरणी (आपके एक [i] मान) से गुजरने वाले मान से गुंजाइश है, इसलिए मैंने इसे विभाजित करने के लिए बदल दिया .. tmpLine [j]। मैंने यह भी पाया कि ईएनडी अनुभाग से 'i' चर को फंक्शन reverse
में दायरे में रखा गया था, इसलिए मैंने स्थिति को असंबद्ध करने के लिए जे को बदल दिया।
मुझे कुछ चीजों को समझना पड़ा, इसलिए मैंने उपयोग किया गया डीबग संस्करण नीचे दिया गया है।
यदि आपके पास गॉक तक पहुंच है, तो आप यह जानने के लिए अच्छी तरह से सीखेंगे कि उपलब्ध डीबगर का उपयोग कैसे करें। यदि आप डीबगर के बिना सिस्टम पर awk/gawk/nawk का उपयोग कर रहे हैं, तो यह समझने के लिए एक तरीका है कि आपके कोड में क्या हो रहा है। आप किसी फ़ाइल या पाइप के लिए अपने कार्यक्रमों उत्पादन रीडायरेक्ट करते हैं, और यदि आपने प्रणाली "/ dev/stderr" अंकन का समर्थन करता है, तो आप डिबग लाइनों वहाँ प्रिंट कर सकता है, यानी
#dbg print "#dbg0:line=" line > "/dev/stderr"
कुछ सिस्टम तक पहुँचने के लिए अन्य अंकन है stderr, तो अगर आप यह बहुत कुछ कर रहे हैं, तो यह पता लगाने योग्य है कि क्या उपलब्ध है।
cat commandFile.debug
function reverse(line) {
n=split(line, tmpLine)
#dbg print "#dbg0:line=" line
#dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j]
for (j=n; j>0; j--) {
#dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j]
printf("%s ",tmpLine[j])
}
}
# main loop
{ a[NR]=$0 }
# print reversed array
#dbg END{ print "AT END"; for(i=NR; i>0; i--) printf("#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i])
) }
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) }
मुझे उम्मीद है कि इससे मदद मिलती है। अच्छी तरह से प्रस्तुत प्रश्न (पहली बार भी!) के लिए
+1। अच्छा स्वरूपण, नमूना इनपुट, नमूना आउटपुट और कोड जो काम नहीं कर रहा है! अच्छा शो और पोस्टिंग रखें! – shellter