2012-03-27 5 views
7

मैं प्रोग्रामिंग भाषा और सामग्री पर नया हूं इसलिए मुझे फाइलों से उन सभी पंक्तियों के साथ-साथ उन सभी पंक्तियों के साथ-साथ उन्हें वापस प्रिंट करना होगा और उन्हें प्रिंट करना होगा।Awk दोनों पंक्तियों और शब्दों को उलट देता है

"File1" उल्टा करने के लिए:

आ bb सीसी

foo के रूप में

और "File1" के उत्पादन मुद्रण कर इस होना चाहिए:

जैसा कि foo

सीसी bb आ

मैं शब्द के लिए यह करने की कोशिश की प्रत्येक पंक्ति में रिवर्स:

for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)

लेकिन मैं इस

{a[NR]=$0 
}END{for(i=NR; i; i--) print a[i]} 

क्या करना है अगर मैं उलट लाइनों प्रिंट करना चाहते हैं मुझे टर्मिनल में इस कमांड के साथ दो फाइलों के साथ काम करने की ज़रूरत है:

awk -f commandFile FileToBePrinted 

समस्या यह है कि मैं इन सब में शुरुआत कर रहा हूं और मुझे नहीं पता कि उन दोनों को कैसे गठबंधन करना है। धन्यवाद!

+0

+1। अच्छा स्वरूपण, नमूना इनपुट, नमूना आउटपुट और कोड जो काम नहीं कर रहा है! अच्छा शो और पोस्टिंग रखें! – shellter

उत्तर

3

कीव के समाधान प्रत्येक शब्द में पाठ उल्टा करने के लिए लग रहा है:

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])) } 

मुझे उम्मीद है कि इससे मदद मिलती है। अच्छी तरह से प्रस्तुत प्रश्न (पहली बार भी!) के लिए

2
awk ' 
{ 
    x=reverse($0) (x?"\n":"") x 
} 

END{ 
    print x 
} 

function reverse(s, p) 
{ 
    for(i=length(s);i>0;i--) 
     p=p substr(s,i,1) 
    return p 
}' File1 
2

उपयोग tac फ़ाइल की तर्ज उल्टा करने के लिए, तो शब्द को उल्टा करने के AWK।

tac filename | perl -lane 'print join(" ", reverse(@F))' 
संबंधित मुद्दे