অ্যাজ, সিড ব্যবহার করে নির্দিষ্ট প্যাটার্নের সাথে রেখার অংশ বের করা


18

অ্যাডাব্লিক / সেড অপারেটরদের সম্পর্কে আমার একটি প্রশ্ন আছে। আমার কাছে একটি বড় ফাইল রয়েছে যা নিম্নলিখিত পংক্তির পুনরাবৃত্তিগুলি অনুসরণ করেছে

Expression loweWallrhoPhi :  sum=-6.97168e-09
Expression leftWallrhoPhi :  sum=6.97168e-09
Expression lowerWallPhi :  sum=-5.12623e-12
Expression leftWallPhi :  sum=5.12623e-12
Expression loweWallrhoUSf :  sum=-6.936e-09
Expression leftWallrhoUSf :  sum=6.97169e-09
Expression lowerWallUSf :  sum=-5.1e-12
Expression leftWallUSf :  sum=5.12624e-12

আমি পৃথক ফাইলে প্রতিটি ক্ষেত্রে যোগফলের পরে মান বের করতে চাই। একসাথে কি এমন করা সম্ভব?

উত্তর:


26

গ্রেপ কমান্ড সহ:

grep -oP 'sum=\K.*' inpufile > outputfile

সঙ্গে, grep -P(Perl-regexp) প্যারামিটার সমর্থন \K, যা পূর্বে মিলেছে অক্ষর উপেক্ষা ব্যবহার করুন।

Awk কমান্ড সহ:

awk -F"=" '{print $NF}' inputfile > outputfile

আওক NFআপনাকে রেকর্ড / লাইনে মোট ক্ষেত্রের সংখ্যা দেয়। সুতরাং এর সর্বশেষ মানটি একটি রেকর্ড / লাইনের সর্বশেষ ক্ষেত্রের নম্বর।

সিড কমান্ড সহ:

sed 's/^.*sum=//' inpufile > outputfile

^.*=sumসমস্ত অক্ষর ( .*) লাইন ( ^) এবং শেষ অক্ষর ( sum=) শ্বেত স্পেসের অক্ষরের সাথে প্রতিস্থাপন করুন ।

ফলাফল:

-6.97168e-09
6.97168e-09
-5.12623e-12
5.12623e-12
-6.936e-09
6.97169e-09
-5.1e-12
5.12624e-12

আপনি যদি প্রতিটি মান আলাদা আলাদা ফাইলে সংরক্ষণ করতে চান তবে উপরের কমান্ডগুলি কিছুক্ষণ লুপের মধ্যে ব্যবহার করুন:

while read line; do
    echo "$line" | grep -oP 'sum=\K.*'     > $(echo "$line" |awk '{print $2}');
   #echo "$line" | awk -F"=" '{print $NF}' > $(echo "$line" |awk '{print $2}');
   #echo "#line" | sed 's/^.*sum=//'       > $(echo "$line" |awk '{print $2}');
done < file

এটিতে অন্তর্ভুক্ত রয়েছে sum=এবং এটির পরে মানটির মতো নয়sum=
অ্যান্থন

ওপি যোগফলের পরে মানটি চায়, এছাড়াও এনএফ-এর বিশদ বিবরণটি ভয়াবহ।

1
এই খুব ভাল উত্তর সম্পূর্ণ করার জন্য, আপনার কাছে ব্যবহার করতে পারেন cut: cut -d'=' -f2 file
ফেডোরকুই

এটি একটি খুব ভাল উত্তর। আমি এটা পছন্দ। ধন্যবাদ.
জাফার উইলসন

6

যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি কেবলমাত্র পরে মান পেতে চান =এবং দ্বিতীয় মান (?) এর উপর ভিত্তি করে এই মানগুলি পৃথক ফাইলে সংরক্ষণ করতে চান । আমি যদি ঠিকই এরকম কিছু চেষ্টা করি:

$ awk -F'[ =]' '{print $6>"file_"$2".txt"}' file

ফলাফল:

$ ls -1
  file_leftWallPhi.txt
  file_leftWallUSf.txt
  file_leftWallrhoPhi.txt
  file_leftWallrhoUSf.txt
  file_loweWallrhoPhi.txt
  file_loweWallrhoUSf.txt
  file_lowerWallPhi.txt
  file_lowerWallUSf.txt

$ cat  file_leftWallPhi.txt
  5.12623e-12

@ কাসিয়া আমি আপনার সমস্যাটি জিএনইউ অ্যাজকে ৪.০.২ এর সাথে পুনরুত্পাদন করতে পারি না। আমার উত্তর থেকে প্রাপ্ত আদেশটি -cবিকল্পের সাথেও কাজ করে (traditionalতিহ্যবাহী ইউএনআইএক্সের সাথে সামঞ্জস্যতা মোড awkযেখানে জিএনইউ এক্সটেনশন অক্ষম রয়েছে)। আসল প্রশ্নটি সম্পাদিত হওয়ার সাথে সাথে খালি লাইনগুলি মোছা হওয়ায় নিশ্চিত হয়ে নিন যে আপনি ইনপুট ফাইল আপডেট করেছেন।
জিম্মিজ

1

আপনি এটি দ্বারা করতে পারেন sed

sed -E 's/^.* (\S+)\s*:.*=(\S+)/echo "\2" > "\1".txt/' file | bash

স্ক্রিপ্টটি লাইনে দুটি টুকরো বের করে:

  1. স্পেসগুলির মধ্যে এবং এর মধ্যে :কিছু (আরও 0 পরে) অ-স্থান চিহ্ন থাকা উচিত;
  2. কিছু (আরও 0 পরে) অ-স্থানের প্রতীক = ;

এবং এর ইন এক্সিকিউশন কমান্ড থেকে ফর্ম্যাট করুন যা পাইপের মাধ্যমে স্থানান্তরিত হয়েছিল bash


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