2016-05-18 4 views
7

printf का उपयोग करना, एक एक चरित्र को कई बार मुद्रित कर सकते हैं:एक चरित्र को कई बार मुद्रित करने के लिए printf का उपयोग कैसे करें?

awk में मुझे पता है कि मैं something like कर सकते हैं:

$ awk 'BEGIN {while (i++ < 5) printf "-"}' 
----- 

लेकिन मुझे आश्चर्य है अगर awk's printf इस रूप में अच्छी तरह अनुमति देता है।

मैं printf modifiers पृष्ठ से गुजर गया लेकिन यह नहीं मिला। कुल मिलाकर, क्या बैश से printf करता {1..5} का विस्तार करने और हर पैरामीटर यह हो जाता है के लिए एक - मुद्रित करने के लिए है, इसलिए यह

$ printf "%0.s-" hello how are you 42 
----- 

कह हालांकि के बराबर है, मैं कैसे साथ इस व्यवहार की नकल करने के बारे में ज्ञान की कमी है awk के printf, यदि यह संभव है, क्योंकि इस में विफल रहता है:

$ awk 'BEGIN {printf "%0.s-", 1 2 3 4 5}' 
- 
+1

Mmmm, पर्ल यह भी कर सकते हैं ... 'पर्ल -e" प्रिंट '5'x60 "' :-) –

+0

@MarkSetchell 'awk था 'वह स्मार्ट नहीं है:/न तो 'प्रिंट करें" एक "* 3' और न ही' प्रिंट" एक "x 3' काम। – fedorqui

उत्तर

6

मैं नहीं मानता कि इस awk के printf के साथ संभव है, there is also no way to do this just with printf in C and C++ के रूप में।

अजीब के साथ, मुझे लगता है कि सबसे उचित विकल्प आपके जैसा लूप का उपयोग कर रहा है। किसी कारण से प्रदर्शन महत्वपूर्ण है और awk अड़चन पैदा हो जाता है, तो निम्नलिखित चीज़ों को गति देगा:

awk 'BEGIN {s=sprintf("%5s","");gsub(/ /,"-",s);print s}' 

यह आदेश लघुगणकीय तेजी से चलेंगे [1] हालांकि, उस में एक उल्लेखनीय अंतर का कारण नहीं बनेगा प्रदर्शन जब तक आप कई बार एक चरित्र मुद्रित करने की योजना बना रहे हैं। (एक चरित्र मुद्रण 1,000,000 बार के बारे में 13x तेजी से हो जाएगा।)

इसके अलावा, अगर आप एक लाइनर चाहते हैं और gawk उपयोग कर रहे हैं, भले ही यह गुच्छा का सबसे धीमी है:

gawk 'BEGIN {print gensub(/ /,"-","g",sprintf("%5s",""));}' 

 

[1] जबकि स्प्रिंटफ/gsub कमांड हमेशा लूप का उपयोग करने से तेज़ होना चाहिए, मुझे यकीन नहीं है कि अजीब के सभी संस्करण मेरे जैसा ही व्यवहार करेंगे। मुझे यह भी समझ में नहीं आता कि क्यों-लूप अजीक कमांड में ओ (एन * लॉग (एन)) की समय जटिलता होगी, लेकिन यह मेरे सिस्टम पर करता है।

+2

शानदार! क्या आप अंतर्दृष्टि साझा कर सकते हैं कि आपको जटिलता को कैसे पता चल गया है? मैंने 'awk 'BEGIN {while (i ++ <1000000) printf" - "}' 'और' awk 'BEGIN {s = sprintf ("% 1000000s "," "); gsub (/ /," - ", s) ; प्रिंट एस} '' और अंतर 0.102 बनाम 0.115s था। – fedorqui

+1

बिल्कुल।मैंने चार अलग-अलग अजीब आदेशों को बेंचमार्क करने के लिए एक बैश फ़ंक्शन लिखा था: जबकि-लूप एक, 'gsub' एक,' gensub' एक, और एक नियंत्रण जो केवल एक डैश मुद्रित करता है। इस फ़ंक्शन ने सभी तीनों से डमी समय घटाकर इनपुट और दोहराव की विस्तृत विविधता के खिलाफ सभी आदेशों का परीक्षण किया। इससे, मैंने पाया कि गैन्सब एक बाकी के मुकाबले बहुत धीमी थी, इसलिए मैंने बस बनाम जीएसबी पर ध्यान केंद्रित किया। तब मैंने अपना डेटा लिया और वोल्फ्रामल्फा, कस्टम गणित कार्यों और एक Google शीट के साथ इसके साथ खेला, जिससे मुझे उन बड़े-ओ मूल्यों में ले जाया गया। –

+0

[यहां Google शीट्स में से एक है] (https://docs.google.com/spreadsheets/d/1P8neMgoyJf34uoV1JtQ3hiEZuL0LWnl55z0zTXjwJ-E/edit?usp=sharing), यदि आप उत्सुक हैं। यह अभी भी प्रक्रिया के एकमात्र हिस्से है जिसे मैंने अभी छोड़ा है –

1

मुझे पता है कि यह पुराना है लेकिन चौड़ाई संशोधक का उपयोग किया जा सकता है उदा।

एल = some_value

प्रिंट gensub (//"-", "जी", sprintf ("% * s", एल, ""))

के परिवर्तनशील प्रिंट होगा -

एल

के मूल्य के आधार यह जीएनयू awk 3.1.8

संबंधित मुद्दे

 संबंधित मुद्दे