Awk ব্যবহার করে শেষ দুটি কলাম কীভাবে প্রিন্ট করা যায়


106

আমি চাই শেষ দুটি কলাম মুদ্রিত।


6
কেন এটির 87 up টি upvotes রয়েছে তা পুরোপুরি নিশ্চিত নয়, খুব কমপক্ষে একটি উদাহরণ দিয়ে অবশ্যই এটি উন্নত করা যেতে পারে।
আরজ

সম্ভবত কারণ প্রশ্নটি প্রকৃতির দ্বারা অত্যন্ত সাধারণ এবং সহজেই একটি উদাহরণ ছাড়াই বোঝা যায় যা বিরল, তবে এই ক্ষেত্রে এটি কাজ করে বলে মনে হয়। এখানে সমস্যাটি আমার মনে হয় তথ্যের অভাব নয়, তবে এটি আরও বেশি স্বাধীন গবেষণার অভাব দেখায়।
DryLabRebel

এই প্রশ্নের এছাড়াও সদৃশ এই প্রশ্ন।
DryLabRebel

এটা কি তোমার প্রশ্নের উত্তর? দ্বিতীয় শেষ কলাম / ক্ষেত্রটি
আঁকায়

উত্তর:


194

আপনি ভেরিয়েবলটি ব্যবহার করতে পারেন NFযা ইনপুট রেকর্ডের মোট ক্ষেত্রের সংখ্যায় সেট করা আছে:

awk '{print $(NF-1),"\t",$NF}' file

এটি ধরে নিয়েছে যে আপনার কমপক্ষে 2 টি ক্ষেত্র রয়েছে।


1
আপনার একটি কমা দরকার - যেহেতু আমরা আজ পিক হচ্ছি: স্থানটি ক্ষেত্রকে সংযুক্ত করে, মুদ্রণ বিবৃতিতে কমা ক্ষেত্রগুলি পৃথক করে। এটি দুটি ক্ষেত্র একীভূত করবে
জিম এমকনামারা

18
এখন আপনি "ফিল্ড-অফস-ট্যাব-অফস-ফিল্ড" মুদ্রণ করছেন। এটি হবে awk '{print $(NF-1) "\t" $NF}' fileবা awk '{print $(NF-1), $NF}' fileবা awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

কেবলমাত্র পূর্ববর্তী মন্তব্যে যুক্ত করার জন্য, ব্যবহারের '{print $x,"\t",$y}'ক্ষেত্রে সমস্যাটি হ'ল এটি যে প্রতিটি কমা বিচ্ছিন্ন ভেরিয়েবলকে তার নিজস্ব ক্ষেত্র হিসাবে ব্যাখ্যা করে, তাই ফলাফলটি আসলে আসবে field1<space><tab><space>field2(কারণ এটি ডিফল্টরূপে সাদা স্থান ডিলিমিটার ব্যবহার করবে) field1<tab>field2যার বিপরীতে সম্ভবত আপনি আশা করছেন আউটপুট ফিল্ড বিভাজক (ওএফএস) ব্যবহার করা আপনি যা চান তা প্রায় সর্বদা।
DryLabRebel

13
awk '{print $NF-1, $NF}'  inputfile

দ্রষ্টব্য: কমপক্ষে দুটি কলাম বিদ্যমান থাকলে এটি কেবল কাজ করে। একটি কলাম সহ রেকর্ডে আপনি একটি উত্সাহী পাবেন"-1 column1"


3
চেষ্টা করে দেখুন। এটি সোলারিস 9 টি অজানা & নাওকের কাজ করে। বিকল্পটি হ'ল $ (এনএফ -১)
জিম এমকনামারা

1
@ কোয়াডিক্টিক্ট - আমি অনুমান করছি আপনি বিভিন্ন এডক বাস্তবায়ন নিয়ে কাজ করেন নি। ওল্ড অ্যাডস আচরণগুলি (সম্ভবত ভ্রান্তভাবে) সামনে আনা হয়েছে। আমার বিপরীতে পরীক্ষা করার মতো গৌক নেই - যা সম্ভবত আপনি উল্লেখ করছেন। সুতরাং আমি নিশ্চিতভাবে জানি না কেন আপনার মন্তব্যটি আনপুট হয়েছিল। বাক্সের বাইরে লিনাক্স অজস্র সাধারণত গাবক হয়। আমি পরীক্ষা এবং ফিরে পোস্ট করব। ইতিমধ্যে সোলারিস বা এইচপিইউক্স বা ডিজিএক্স বা পুরানো অ্যাজক দ্বারা আমি কী বোঝাতে চাইছি তা দেখতে চেষ্টা করুন।
জিম এমকনামার

6
আপনি সম্ভবত চেষ্টা করেছিলেন কারণ আপনি এটি কাজ করেছেন ভেবে ভ্রান্ত হয়ে পড়েছেন echo 1 2 3 | awk ...$NF-1হয় ($NF) - 1যে মধ্যে awkবাস্তবায়ন।
স্টিফেন চেজেলাস

"ওয়ান ট্রু আওক" সোর্স কোডটির yaccব্যাকরণে ৪০ টিরও বেশি সংঘাত রয়েছে যা এ এডকে সত্যিকার অর্থে ডাকে বিদ্রূপাত্মক। অজানা বিষয়গুলির বিভিন্ন সংস্করণ আলাদাভাবে পার্সিং করছে? বড় অবাক!
কাজ

1
@ টিএসএসোরার, দিয়ে চেষ্টা করুন echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'- বা অন্য কোনও ইনপুট যেখানে ২ য় শেষ ক্ষেত্রটি শেষ ক্ষেত্রের চেয়ে কম নয় one
গ্লেন জ্যাকম্যান 20

6

@jim McNamara: প্রায় জন্য প্রথম বন্ধনী ব্যবহার করার চেষ্টা করুন NF, অর্থাত্ $(NF-1)এবং $(NF)পরিবর্তে $NF-1এবং $NF(FreeBSD 'র জন্য Mac OS X এর 10.6.8 কাজ awkএবং gawk)।

echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'

# output:
# 1 2
# 2 3
# two three

আমরা ইতিমধ্যে বিবেচনা করেছি ()। আমি ভেবেছিলাম যে আমরা আসল পুরানো অ্যাজক আচরণটি কোথা থেকে এসেছে তা নিয়ে আলোচনা করছি।
জিম এমকনামার

সুস্পষ্ট সাথে একটি উত্তরের জন্য +1 $(NF-1)- যা খুব কমপক্ষে আরও বেশি বহনযোগ্য $NF-1; এটি স্পষ্টতই কম অস্পষ্ট। $(NF)ওভারকিল হয়, যদিও - ঠিক $NFকরবে। 2 টিরও কম কলামের সাথে রেখাগুলি রক্ষণাবেক্ষণ করা সার্থক, যেমন এক-কলামের লাইনের সাহায্যে আপনি প্রথম কলামটির মান দু'বার পেয়েছেন এবং শূন্য-কলামের সাথে - খালি - লাইনগুলি awk কমান্ড পুরোপুরি ব্যর্থ হবে, একটি চেষ্টার কারণে সূচী -1 সহ একটি ক্ষেত্র অ্যাক্সেস করতে।
mklement0

1

গাওক ব্যবহার করা সমস্যাটি দেখায়:

 gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three

আমি সোলারিস 10 এম 4000-তে কেবল গাওয়াক লাগিয়েছি: সুতরাং, গাক এনএফ -1 বনাম $ (এনএফ -1) ইস্যুতে কাপল্রিট। পরবর্তী প্রশ্নে পসিক্স কী বলে? প্রতি:

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

এক দিক বা অন্য কোনও দিক নেই। ভাল না. গাওক বিয়োগফলকে বোঝায়, অন্যান্য জঞ্জাল ক্ষেত্রের নম্বর বা বিয়োগফলকে বোঝায়। হুম।


1
আপনার নমুনা ইনপুট ফাইলের প্রথম 2 টি লাইন সহায়ক নয় যে তারা উভয় আচরণের সাথে একই আউটপুট উত্পাদন করে । আপনি কি দয়া করে পুনরায় নিশ্চিত করতে পারেন যে সোলারিস এডক আসলে এই ক্ষেত্রে গাওকের মতো আচরণ করে না?
mklement0

অ্যাডক স্পিকের জন্য আপনার লিঙ্কটির জন্য: ব্যবহারের জন্য অজানা যুক্তিটি $(NF-1)হ'ল স্পেকের ক্ষেত্রের সূচীটি গণনা করার দুটি উদাহরণই সেই ফর্মটি ব্যবহার করে: $(NF-1)এবং $(NF+2)। তারপরে "এক্সক্লুয়েন্স ইন অ্যাডাব্লিক" বিভাগ রয়েছে, যা $expr[এর চেয়ে অনেক বেশি অগ্রাধিকার " হিসাবে তালিকাভুক্ত রয়েছে expr - expr। যেহেতু NFনিজেই একটি প্রকাশ, তাই $NF-1মূল্যায়ন করা উচিত ($NF)-1। এমনকি যদি, সর্বোপরি, সত্যিকার অর্থেই সেখানে বিশ্রী বাস্তবায়ন রয়েছে যা মূল্যায়ন $NF-1করে $(NF-1), এখানে শেখা পাঠটি $(NF-1)হ'ল নিরাপদ এবং বহনযোগ্য পছন্দ।
mklement0

0

এটি দিয়ে চেষ্টা করুন

$ cat /tmp/topfs.txt
/dev/sda2      xfs        32G   10G   22G  32% /

awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'

awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%

awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /

0

সমস্ত সম্ভাব্য পরিস্থিতি বিবেচনার জন্য দয়া করে এটি ব্যবহার করে দেখুন:

awk '{print $(NF-1)"\t"$NF}'  file

অথবা

awk 'BEGIN{OFS="\t"}' file

অথবা

awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.