سؤال

لا بد لي من التعامل مع الملفات النصية في مجموعة متنوعة من التنسيقات.إليك مثال (الأعمدة أ و ب محددة بعلامات جدولة):

A   B
a   Name1=Val1, Name2=Val2, Name3=Val3
b   Name1=Val4, Name3=Val5
c   Name1=Val6, Name2=Val7, Name3=Val8

يمكن أن تحتوي الملفات على رؤوس أم لا، أو تحتوي على أنظمة تحديد مختلطة، أو تحتوي على أعمدة تحتوي على أزواج اسم/قيمة كما هو مذكور أعلاه وما إلى ذلك.
غالبًا ما أحتاج إلى استخراج البيانات من هذه الملفات بطرق مختلفة.على سبيل المثال، من البيانات المذكورة أعلاه، قد أرغب في الحصول على القيمة المرتبطة بـ Name2 حيث تكون موجودة.أي.

A   B
a   Val2
c   Val7

ما هي الأدوات/التقنيات المتوفرة لإجراء مثل هذه المعالجات كأوامر سطر واحد، باستخدام ما ورد أعلاه كمثال ولكن يمكن توسيعه ليشمل حالات أخرى؟

هل كانت مفيدة؟

المحلول

لا أحب sed كثيرًا، لكنه يعمل لمثل هذه الأشياء:

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

يعطيك:

 A B
 a Val2
 c Val7

نصائح أخرى

لديك جميع أوامر bash Shell الأساسية، على سبيل المثال grep، وcut، وsed، وawk تحت تصرفك.يمكنك أيضًا استخدام Perl أو Ruby للأشياء الأكثر تعقيدًا.

مما رأيته، سأبدأ بـ Awk لهذا النوع من الأشياء، وبعد ذلك إذا كنت بحاجة إلى شيء أكثر تعقيدًا، سأتقدم إلى Python.

سأستخدم sed :

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive

نظرًا لأنك تمتلك cygwin، سأختار Perl.إنها الأسهل للتعلم (راجع كتاب O'Reily: تعلم بيرل) وقابلة للتطبيق على نطاق واسع.

سأستخدم بيرل.اكتب وحدة صغيرة (أو أكثر) للتعامل مع التنسيقات المختلفة.يمكنك بعد ذلك تشغيل Perl oneliners باستخدام تلك المكتبة.مثال على ما سيبدو على النحو التالي:

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

لا تقتبس مني بناء الجملة، ولكن هذه هي الفكرة العامة.قم بتجريد المهمة التي بين يديك للسماح لك بالتفكير فيما يجب عليك القيام به، وليس في كيفية القيام بذلك.سيكون روبي خيارًا آخر، فهو يميل إلى أن يكون لديه بناء جملة أكثر وضوحًا، ولكن أيًا من اللغتين ستعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top