ট্যাব পৃথক মানগুলিকে পৃথক করে


90

আমি কীভাবে টিএবি পৃথক স্ট্রিং থেকে প্রথম কলামটি নির্বাচন করব?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

উপরেরগুলি সম্পূর্ণ লাইনটি প্রত্যাশা হিসাবে কেবল "LOAD_SETTLED" নয়, ফিরিয়ে দেবে।

হালনাগাদ:

আমার ট্যাব দ্বারা পৃথক করা মানগুলির মধ্যে তৃতীয় কলামটি পরিবর্তন করতে হবে। নিম্নলিখিত কাজ করে না।

echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt

এটি তবে আশানুরূপভাবে কাজ করে যদি ট্যাবের পরিবর্তে বিভাজক কমা হয়।

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt

4
awk 'BEGIN {FS = "[\ t] +"}; {মুদ্রণ $ 1} '# এটি আমি খুঁজছিলাম। আমার গুগল অনুসন্ধান কি সঠিক? :)
শান্তনুও

4
এই মন্তব্যে ধন্যবাদ, আমি আবিষ্কার করেছি: awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txtপ্রথম তিনটি কলামের ট্যাব-বিস্মৃত মানগুলি মুদ্রণ করতে।
Wok

6
অথবা সম্ভবত সহজভাবেawk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
জোশিয়ার যোডার

4
-vভেরিয়েবল সেট করার জন্য জিএনইউ এবং বিএসডি উভয় সমর্থন করে । BEGIN {FS="\t"}কোনও ইনলাইন প্রোগ্রামের অভ্যন্তরে ব্যবহার করা এটি কুৎসিত এবং আপনি যে জাতীয় ওপেন সোর্স অবদানের জন্য চেষ্টা করেন তাতে আপত্তি হওয়ার সম্ভাবনা রয়েছে। আপনি যদি কোনও প্রোগ্রাম ফাইল লিখতে থাকেন তবেই তা করুন । এছাড়াও, এটির -Fপরিবর্তে এটি ব্যবহার করতে নিরুৎসাহিত করা হয়েছে -v FS=কারণ পরবর্তীকালে এটি পরিষ্কার করে দেয় যে কেবল FSসেট করা হচ্ছে এবং না OFS। এই শেষ পয়েন্ট সম্পর্কে বিভ্রান্তি এই পোস্টটি প্রথম স্থানে নিয়ে আসে। এজন্য "ভাল স্টাইল" গুরুত্বপূর্ণ is
ব্রুনো ব্রোনোস্কি

4
দয়া করে, @ উইক যা দেখিয়েছেন তা কারও কারও কখনও করা উচিত নয়। আপনি আপনার আউটপুটে [ইনপুট] ফিল্ড বিভাজনকারী গণনা করবেন না। আপনি OFSভেরিয়েবলের মাধ্যমে একটি আউটপুট ফিল্ড বিভাজক নির্দিষ্ট করে ।
ব্রুনো ব্রোনসকি

উত্তর:


141

আপনাকে OFSএকটি ট্যাব হতে চলক (আউটপুট ফিল্ড বিভাজক) সেট করতে হবে:

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

(নিশ্চিত হয়ে নিন যে আপনি $lineপ্রতিধ্বনি বিবৃতিতে ভেরিয়েবলটি উদ্ধৃত করেছেন)


6
$ ইন $ '\ টি' এর উদ্দেশ্য কী?
আমর মোস্তফা

10
অ্যাডভান্সড ব্যাশ স্ক্রিপ্টিং গাইড থেকে আমার নিজের প্রশ্নের উত্তর দেওয়া : $ '...' উদ্ধৃত স্ট্রিং-এক্সপেনশন কনস্ট্রাক্ট এমন একটি প্রক্রিয়া যা পালিয়ে যাওয়া অক্টাল বা হেক্স মানগুলি ব্যবহার করে ..., যেমন, উদ্ধৃতি = $ '\ 042'।
আমর মোস্তফা

4
@AmrMostafa, পথপ্রদর্শক একটি বিভ্রান্তিকর ব্যাখ্যা এক নেতৃস্থানীয় মনে হবে যে আপনি না হয়েছে খুব খারাপ যে $মধ্যে $'\t'প্রয়োজন হয় না। গ্রেগের উইকিটি আরও ভাল: "এগুলির $'...'মধ্যে সর্বাধিক প্রচলিত, এবং ব্যাকস্ল্যাশ-পলায়নযুক্ত সমন্বয়গুলি এএনএসআই সি স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হিসাবে প্রসারিত ছাড়া কেবল একক উদ্ধৃতিগুলির মতো কাজ করে"।
ক্রিশ্চিয়ান সিউপিতু

9
অনড় দৃষ্টিতে, এটি $'\t'প্রয়োজনীয় নয়। "\t"
অ্যাডাব্লিক

4
ওপেন সোর্স কন্ট্রিবিউটর, আমি আপনাকে অনুরোধ করছি, দয়া করে স্টাফ জমা দিন না awk -F $'\t' 'BEGIN {OFS = FS} …'। তা হওয়া উচিত awk -v FS='\t' -v OFS='\t' '…'। এটি পেডেন্টিক মনে হতে পারে তবে বেমানান হওয়ার কারণে পরবর্তী অবদানকারী কোনও বাগ প্রবর্তন করার সম্ভাবনা বাড়ে কারণ তারা আপনার কোডকে ভুল বোঝে।
ব্রুনো ব্রোনোস্কি

21

নিশ্চিত করুন যে তারা সত্যই ট্যাব! ব্যাশে, আপনি ব্যবহার করে একটি ট্যাব sertোকাতে পারেনC-v TAB

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED


9

আমি ব্যবহার FSএবং OFSভেরিয়েবল BIND- র জোন ফাইল যা ট্যাব সীমায়িত করা হয় নিপূণভাবে করতে। এখানে আমার স্ক্রিপ্টগুলির একটি https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39

এর মাংস হ'ল:

awk -v FS='\t' -v OFS='\t' \
    -v record_type=$record_type \
    -v hostname=$hostname \
    -v ip_address=$ip_address '
$1==hostname && $3==record_type {$4=ip_address}
{print}
' $zone_file > $temp

এটি করার জন্য এটি একটি পরিষ্কার এবং সহজেই পড়ার উপায়।



0

এটি কি কাজ করা উচিত নয়?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.