जाग मुद्रण के बिना newline


169

मैं चाहता हूं कि प्रत्येक योग में चर राशि / एनआर को एक साथ मुद्रित किया जाए। हम प्रत्येक पुनरावृति में नईलाइन छापने से awk से कैसे बचते हैं? मेरे कोड में प्रत्येक पुनरावृति में एक नई पंक्ति डिफ़ॉल्ट रूप से मुद्रित होती है

for file in cg_c ep_c is_c tau xhpl
printf "\n $file" >> to-plot.xls
    for f in 2.54 1.60 800 
        awk '{sum+=$3}; END  {print  sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
    done
done

मैं चाहता हूं कि आउटपुट इस तरह दिखाई दे

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3

मेरा वर्तमान आउट पुट ऐसा है

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3

जवाबों:


219

awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

printडिफ़ॉल्ट रूप से एक नई पंक्ति सम्मिलित करेगा। आप नहीं चाहते कि ऐसा हो, इसलिए printfइसके बजाय उपयोग करें ।


4
लेकिन मन है कि printfव्याख्या %sइसलिए के printf "%s" whateverबजाय का उपयोग करें printf whatever
मैथ्यू

1
printf "%s",whateverआप कॉमा को भूल गए। आप अधिक चर के साथ भी विस्तार कर सकते हैं और उन्हें अल्पविराम से अलग कर सकते हैं।
हेलेके वालिंगा

74

AWK में ORS (आउटपुट रिकॉर्ड सेपरेटर) चर "\ n" में चूक जाता है और हर पंक्ति के बाद मुद्रित होता है। BEGINयदि आप लगातार सब कुछ मुद्रित करना चाहते हैं तो आप इसे अनुभाग में "" बदल सकते हैं ।


6
तुम भी इसे ""(कोई स्थान) सेट करना चाहते हो सकता है कोई जुदाई नहीं है।
mschilli

8
इस तरह:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
फ्रेड्रिक एर्लडसन

2
या ORS="\r"यदि आप चाहते हैं कि उदाहरण के लिए प्रगति दिखाते हुए एक काउंटर प्रिंट करें।
स्किप्पी ले ग्रांड गौरौ

47

मुझे लगता है कि बहुत से लोग इस सवाल में प्रवेश कर रहे हैं कि नई लाइन से बचने का कोई रास्ता खोज रहे हैं awk। इस प्रकार, मैं सिर्फ उस समाधान का प्रस्ताव देने जा रहा हूं, क्योंकि विशिष्ट संदर्भ का उत्तर पहले से ही हल था!

में awk, printस्वचालित रूप से एक ORSमुद्रण के बाद सम्मिलित करता है । ORS"आउटपुट रिकॉर्ड सेपरेटर" के लिए खड़ा है और नई लाइन में चूक करता है। तो जब भी आप कहते हैं print "hi"awk प्रिंट "hi" + नई लाइन।

इसे दो अलग-अलग तरीकों से बदला जा सकता है: खाली का उपयोग करना ORSया उपयोग करना printf

खाली का उपयोग करना ORS

awk -v ORS= '1' <<< "hello
man"

यह "नरक" देता है, सभी एक साथ।

यहां समस्या यह है कि सभी जाग एक खाली सेटिंग को स्वीकार नहीं करते हैं ORS, इसलिए आपको संभवतः एक और रिकॉर्ड विभाजक सेट करना होगा।

awk -v ORS="-" '{print ...}' file

उदाहरण के लिए:

awk -v ORS="-" '1' <<< "hello
man"

"हेलो-मैन-" लौटाता है।

उपयोग करना printf(बेहतर)

जबकि रिकॉर्ड के बाद printसंलग्न करता है ORS, printfनहीं करता है। इस प्रकार, printf "hello"सिर्फ "हैलो" प्रिंट करता है, और कुछ नहीं।

$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye

अंत में, ध्यान दें कि सामान्य रूप से यह एक अंतिम नई लाइन याद करती है, ताकि शेल प्रॉम्प्ट आउटपुट की अंतिम पंक्ति के समान लाइन में हो। इसे साफ करने के लिए, END {print ""}सभी प्रोसेसिंग के बाद एक नई लाइन प्रिंट की जाएगी।

$ seq 5 | awk '{printf "%s", $0}'
12345$
#    ^ prompt here

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345

5

एक रास्ता

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls

1
माइनर नोट: कभी उपयोग न करें printf $0, क्योंकि $0इसमें तार जैसे हो सकते हैं %F, आदि ... बाद में आसानी से विफल रहता है (कम से कम GAWK 3.1.5 के साथ) echo "%F"|awk '{printf $0}':। printf "%s",$0इसके बजाय प्रयोग करें ।
व्लाद


1

यदि पर्ल एक विकल्प है, तो यहां फेडोरक्वी के उदाहरण का उपयोग करके एक समाधान है:

seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

स्पष्टीकरण:
chompनई
print "$_ "लाइन को हटाता है प्रत्येक पंक्ति को प्रिंट करता है, एक स्थान
को जोड़ने से END{}ब्लॉक का उपयोग एक नई रेखा को प्रिंट करने के लिए किया जाता है

उत्पादन: 1 2 3 4 5

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.