নিউলাইন প্রিন্ট না করে awk


169

আমি চাই যে প্রতিটি চলকের ক্ষেত্রে পরিবর্তনশীল যোগ / এনআর পাশাপাশি-প্রিন্ট করা হোক। আমরা কীভাবে প্রতিটি পুনরাবৃত্তিতে নিউলাইন মুদ্রণ করা থেকে বিশৃঙ্খলা এড়াতে পারি? আমার কোডে প্রতিটি পুনরাবৃত্তিতে একটি নতুন লাইন ডিফল্টরূপে মুদ্রিত হয়

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

ওএসএস (আউটপুট রেকর্ড পৃথককারী) পরিবর্তনশীল এডাব্লুকেতে "\ n" এ ডিফল্ট হয় এবং প্রতিটি লাইনের পরে মুদ্রিত হয়। আপনি BEGINযদি ধারাবাহিকভাবে মুদ্রিত সবকিছু চান তবে আপনি বিভাগটিতে এটি "" এ পরিবর্তন করতে পারেন।


6
এমনকি একে একে ""আলাদা করার জন্য আপনি এটি (স্থান নেই) সেট করতেও চাইতে পারেন ।
মিসচিলি

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"আউটপুট রেকর্ড বিভাজক" এবং নতুন লাইনে ডিফল্ট stands সুতরাং আপনি যখনই বলছেন print "hi"awk প্রিন্ট করে "হাই" + নতুন লাইন।

এটি দুটি ভিন্ন উপায়ে পরিবর্তন করা যেতে পারে: খালি 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, ইত্যাদি ... সহজে অনুসরণ ব্যর্থ (হাবা সঙ্গে অন্তত 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.