awk সেড যদি বিবৃতি


9

আমি শুরুতে 0 যুক্ত করার চেষ্টা করছি, যদি সেখানে একটি "থাকে"। line লাইনের ২ য় অক্ষরে। আমি এই দুটি একত্রিত করতে পারে না;

awk '{ print substr( $0, 2, 1 ) }' file.txt 

দ্বিতীয় চরিত্র দেখাচ্ছে

sed -ie "s/.\{0\}/0/" file.txt

শুরুতে একটি শূন্য যোগ করা।

একটি "যদি দ্বিতীয় চরিত্রটি একটি বিন্দু হয়" হওয়া উচিত।

নমুনা ফাইল:

1.02.2017 23:40:00
10.02.2017 23:40:00

চূড়ান্ত:

01.02.2017 23:40:00
10.02.2017 23:40:00

উত্তর:


12

আমরা যে কোনও একটি sedবা awkসম্পূর্ণরূপে সমস্যার সমাধান করতে ব্যবহার করতে পারি ।


সহ sed:

$ sed 's/^.\./0&/' file.txt

যখন &প্রতিকল্পন কমান্ড (প্রতিস্থাপন অংশে ঘটে s), ইনপুট লাইন যে কমান্ডের প্যাটার্ন অংশ মিলে যায় অংশ প্রসারিত করা হবে না।

নিয়মিত অভিব্যক্তির ^.\.অর্থ " ( ) একটি ল্যাবরেটরি ডট ( ) এর পরে একটি স্বেচ্ছাচারিত অক্ষর ( ) এর সাথে শুরু হওয়া সমস্ত লাইন মেলে^.\. "।

লাইনটি থাকলে 1.02.2017 23:40:00, প্যাটার্নটি মিলবে এবং লাইনের শুরুতে 1.প্রতিস্থাপন করা 01.হবে।


সহ awk:

awkপ্রশ্নে আংশিক কোড তৈরি করা ...

এটি যেমন বলা হয়েছে, ইনপুটটির প্রতিটি লাইনের দ্বিতীয় অক্ষরটি মুদ্রণ করবে:

$ awk '{ print substr($0, 2, 1) }' file.txt

আমরা substr($0, 2, 1)দ্বিতীয় চরিত্রটি ফিরে আসে এবং এটি শর্ত হিসাবে ব্যবহার করতে পারি:

$ awk 'substr($0, 2, 1) == "." { ... }' file.txt

কি মধ্যে যায় { ... }কোড যে prepends $0, একটি শূন্য দিয়ে যা বর্তমান লাইন বিষয়বস্তু, যদি পূর্ববর্তী শর্ত সত্য:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt

তারপরে আমাদের নিশ্চিত করা দরকার যে সমস্ত লাইন মুদ্রিত হয়েছে:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt

শর্তটি substr($0, 2, 1) == "."অবশ্যই একটি নিয়মিত অভিব্যক্তিতে রূপান্তরিত হতে পারে ( sedসমাধানে আমরা যেমন ব্যবহার করেছি ঠিক তেমনই অভিব্যক্তিটি ব্যবহার করি ):

$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt

কিছু লোক যারা "খাটো সবসময়ই উন্নত" বলে মনে করেন তারা লিখতেন

$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt

(এবং সম্ভবত বেশিরভাগ স্পেসও সরিয়ে ফেলবে awk '/^.\./{$0="0"$0}1' file.txt:)


1
+1 আপনার শেষ এডাব্লুকে উদাহরণ বা আপনার এসড উদাহরণ এটি করার সঠিক উপায়। দ্রষ্টব্য, স্পষ্টতার জন্য, এটি কেবল এক বা অন্য হতে পারে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমার মতে "সঠিক" পদ্ধতি, (যা এবং স্পেস দিয়ে বেহালার না যা যাহাই হউক না কেন হালকা ওজন হয়) আপনার চূড়ান্ত সংস্করণ sed 's/^.\./0&/' file.txt। আমি মনে করি আপনার এই উত্তরটির শুরুতে এটি করা উচিত। তবুও, +1।
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড আমরা দয়া করে লক্ষ্য করি।
কুসালানন্দ

5

সেড সহ:

sed -e "/^.\./s/^/0/" file.txt 

প্যাটার্নটি /^.\./কোনও অক্ষর এবং লাইনের শুরুতে একটি আক্ষরিক বিন্দুর সন্ধান করে ^এবং যদি এটি মেলে, sতবে শূন্যের সাথে রেখার শুরুটি কার্যকরভাবে শুরুতে শূন্যকে যুক্ত করে।

সেড এক্সপ্রেসইন s/.\{0\}/0/কিছুটা বিজোড়, এটি শূন্য বা আরও কিছু কপির সাথে মেলে এবং একটি শূন্যের সাথে প্রতিস্থাপন করে। প্যাটার্নটি অবশ্যই স্ট্রিংয়ের প্রতিটি পজিশনে মিলবে, তবে যেহেতু s///কেবল প্রথম ম্যাচটি প্রতিস্থাপন করা হয়েছে, এটি আপনার ইচ্ছা অনুযায়ী কাজ করে। যদিও এটি করার একটি দুর্দান্ত উপায়।


বা জোর দিয়ে, একই ধরণের রেজেক্স লাইনের সাথে মেলে কাজ করতে পারে তবে আমরা ব্যবহার করতে পারি substr:

awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 

দ্বিতীয় অক্ষরটি বিন্দু কিনা তা আমরা প্রথমে পরীক্ষা করি, তারপরে যদি লাইনের সামনের অংশে একটি শূন্য যোগ করে। চূড়ান্ত একটি কোনও পরিবর্তনের পরে লাইনটি মুদ্রণের ডিফল্ট ক্রিয়াকে আহ্বান করে।


4

আপনি অদ্ভুত এবং খারাপ বলেছিলেন, তবে মনে হচ্ছে আপনি কোনও তারিখ ফর্ম্যাট করার চেষ্টা করছেন এবং তার জন্য আমি dateকমান্ডটি ব্যবহার করব । এই ক্ষেত্রে:

echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d

আউটপুট হবে

01.02.2017 23:40:00

sedমাঝখানে কমান্ড মধ্যে ইনপুট জন্য স্ল্যাশ করার সময়সীমার পরিবর্তন date -d। বিন্যাস বিকল্পগুলি আপনার যে কোনও বিন্যাসে আউটপুট দেয়। %mবিশেষ ইচ্ছার শূন্য প্যাডে মাস, যা মনে হয় কি মত আপনি না করার চেষ্টা করছেন।

কুসালানন্দ যেমন উল্লেখ করেছেন:

আরও কমপ্যাক্ট (জিএনইউ তারিখ এবং বাশ): date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'


2
চমৎকার ধরা! আরও কমপ্যাক্ট (জিএনইউ তারিখ এবং বাশ):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
কুসালানন্দ

যখনই আমি আমার ধরনে স্ল্যাশ, কিন্তু কোন পাইপ আছে s|\.|/|g। অন্যথায়, উপরে উল্লিখিত হিসাবে: দুর্দান্ত ধরা, +1
অ্যালেক্স স্ট্রাজি

2

অন্যান্য উত্তরে উপস্থাপনার চেয়ে আলাদা কৌশল: আপনি "ব্যবহার করতে পারেন।" ক্ষেত্র বিভাজক হিসাবে।

awk -F. '$1 < 10 {printf "0"} {print}' /tmp/in.txt

আপনি এটিকে গল্ফ করতে পারেন:

awk -F. '$1<10{printf "0"}1' /tmp/in.txt

সেডের জন্য, একটি আরও ছোট কমান্ড রয়েছে, যা অন্য (দুর্দান্ত) উত্তরে উপস্থাপন করা হয়েছে।


1
বিকল্প: awk -F. '{print ($1<10?0$0:$0)}' file
জর্জ ভ্যাসিলিউ

1

সেড সঙ্গে এটি হতে পারে

sed 's/^\(.\)\.\(.*\)/0\1.\2/'

এটি ^লাইনটির শুরুতে অ্যাঙ্কর ব্যবহার করবে , তারপরে একটি গ্রুপে যে কোনও একক অক্ষরকে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে এবং .অন্য যে কোনও কিছু গ্রহণ করবে। যদি আমরা এটি মুদ্রণের সাথে মিলে যায় 0, তবে আমাদের প্রথম ক্যাপচার গ্রুপটি (লাইনটির শুরুতে বর্ণচিহ্ন), .তারপরে আমাদের দ্বিতীয় ক্যাপচার গ্রুপ (লাইনের বাকী অংশ)


এটি ক্যাপচারিংয়ের কোনও কাজ করার দরকার নেই not &তোমার বন্ধু. কুসালানন্দের সিড উদাহরণ দেখুন।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস উইলিয়ামসন প্রয়োজনীয় নয়, তবে ইতিমধ্যে অন্যান্য উদাহরণ রয়েছে যা এটির আরও একটি বৈশিষ্ট্য দেখায় sedযে এটি অন্যান্য পরিস্থিতিতেও কার্যকর হতে পারে, কেবল এই নির্দিষ্ট সমস্যা নয়
এরিক রেনোফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.