কীভাবে ":" কে অ্যাডকে ফিল্ড বিভাজক হিসাবে ব্যবহার করবেন?


243

নিম্নলিখিত আদেশ দেওয়া:

echo "1: " | awk '/1/ -F ":" {print $1}'

কেন আওক আউটপুট দেয়:

1: 

উত্তর:


382

"-F" হ'ল একটি কমান্ড লাইন আর্গুমেন্টটি বিশ্রী বাক্য গঠন নয়, চেষ্টা করুন:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
অজ্ঞতার প্রশ্নটি এখানে: / 1 / অংশটি কেবল সারিটি প্রক্রিয়া করতে (বা আরও সুনির্দিষ্ট হওয়ার জন্য রেকর্ডগুলি) ডেকে ডাকে ঠিক 1 নম্বরটি যুক্ত করে?
ransh

3
@ ক্রম আওক সিনট্যাক্স দেখে মনে হচ্ছে (pattern){action}। যদি pattern(বেশিরভাগই একটি শর্তাধীন বিবৃতি) হল সত্য , actionমৃত্যুদন্ড কার্যকর করা হয়। যদি patternপাওয়া না যায় trueতবে নিহিত থাকে। এখানে patternহয় /1/যেখানে বলা Regex হয় 1বর্তমান রেকর্ড মিলেছে$0
kvantour

62

আপনি যদি এটি প্রোগ্রামক্রমে করতে চান তবে আপনি FSভেরিয়েবলটি ব্যবহার করতে পারেন :

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

নোট করুন যে আপনি লুপের পরিবর্তে এটি যদি মূল লুপে পরিবর্তন করেন তবে বর্তমান লাইনটি ইতিমধ্যে বিভক্ত হয়ে গেছে বলে BEGINএটি পরবর্তী পংক্তিতে পড়ার জন্য প্রভাব ফেলবে ।


35

:বিভাজক হিসাবে সেট করার জন্য আপনার একাধিক উপায় রয়েছে :

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

এগুলির সমস্ত সমতুল্য এবং 1একটি নমুনা ইনপুট "1: 2: 3" এর জন্য ফিরে আসবে :

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

পছন্দসই উপায় কোনটি? আমি ধরে নিয়েছি যে BEGINবিবৃতিটির সাথে চূড়ান্ত উদাহরণটি সবচেয়ে সঠিক হবে (সামগ্রিক awkবাক্য গঠনের সাথে সামঞ্জস্যপূর্ণ )।

1
@Rrandomware তাদের সব ঠিক আছে। আমি BEGINপুরো জিনিসটি সংরক্ষণ করার জন্য কোনও ফাইল ব্যবহার করি, তবে -Fওয়ান-লাইনারগুলির সাথে কাজ করার সময় আমি ব্যবহার করার প্রবণতা রাখি ।
ফেডোরকি 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1
এটি অবশ্যই বলা উচিত যে তৃতীয় কেস এবং অন্য সকলের মধ্যে সূক্ষ্ম পার্থক্য রয়েছে। উদাহরণ: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileএবংawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
কানভাতর


12

-Fএটি awkনিজের পক্ষে যুক্তি :

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
কোলন উদ্ধৃতি দেওয়ার দরকার নেই।
সিভ করা

6

আপনি ক্ষেত্র বিভাজক হিসাবে একটি রেজেক্সও ব্যবহার করতে পারেন, নিম্নলিখিতটি "10" বিভাজক হিসাবে সেট করার জন্য একটি রেইজেক্স ব্যবহার করে "বার" মুদ্রণ করবে।

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

এত বেশি লেখার দরকার নেই। কেবলমাত্র আপনার পছন্দসই ক্ষেত্র বিভাজককে -F বিকল্পের সাথে awk কমান্ডে এবং আপনার উল্লিখিত ফিল্ড বিভাজক অনুযায়ী আলাদা আলাদা কলামটি প্রিন্ট করতে চান।

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

Awk টেক্সট অনুবাদক হিসেবে কাজ করে যে সমগ্র নথির জন্য linewise যায় এবং প্রতিটি লাইন জন্য fieldwise যায় এইভাবে $ 1, $ 2 .. $ এন হয় প্রতিটি লাইনে ক্ষেত্র উল্লেখ ($ 1 প্রথম ক্ষেত্র, $ 2 দ্বিতীয় ক্ষেত্র এবং সেরকম ...)। কমান্ড লাইনের নীচে "FF = ..." দিয়ে দুটি বন্ধনীতে "-F" স্যুইচ ব্যবহার করে আপনি একটি ফিল্ড বিভাজককে সংজ্ঞায়িত করতে পারেন। এখন "JUERGEN" এর উত্তরটি বিবেচনা করুন:

echo "1: " | awk -F  ":" '/1/ {print $1}'

ক্ষেত্রের সীমানা উপরে ":" দ্বারা সেট করা আছে সুতরাং আমাদের দুটি ক্ষেত্র রয়েছে $ 1 যা "1" এবং $ 2 যা খালি স্থান। পরে, নিয়মিত অভিব্যক্তি আসে "/ 1 /" যা ফিল্টারটিকে কেবল প্রথম ক্ষেত্রের আউটপুট করতে নির্দেশ দেয় দোভাষী যখন এই জাতীয় অভিব্যক্তিযুক্ত একটি লাইনের উপরে হোঁচট খায় (যার অর্থ 1); "প্রতিধ্বনি" কমান্ডের আউটপুট হ'ল একটি লাইন যা "1" ধারণ করে তাই ফিল্টারটি কাজ করবে ...

নিম্নলিখিত উদাহরণের সাথে কাজ করার সময়:

echo "1: " | awk '/1/ -F ":" {print $1}'

বাক্যবিন্যাসটি অগোছালো এবং দোভাষী দফতর এফ ":" উপেক্ষা করতে পছন্দ করেছেন এবং ডিফল্ট ক্ষেত্রের স্প্লিটারে স্যুইচ করে যা খালি জায়গাটি এইভাবে প্রথম ক্ষেত্র হিসাবে "1:" আউটপুট দেয় এবং দ্বিতীয় ক্ষেত্রও থাকবে না!

JUERGEN এর উত্তরে ভাল বাক্য গঠন রয়েছে ...


2

অথবা আপনি ব্যবহার করতে পারেন:

echo "1: " | awk  '/1/{print $1-":"}' 

এটি সত্যিই মজার সমীকরণ।


1
কি /1/মানে?

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