اطبع العمود/الحقل الأخير في awk




gawk (6)

أريد طباعة العمود أو الحقل الأخير الثاني في awk. عدد الحقول متغير. أعلم أنه يجب أن أتمكن من استخدام $NF ولكن غير متأكد من كيفية استخدامه.

وهذا لا يبدو ناجحا:

awk ' { print ( $NF-- )  } '

أول يخفض القيمة ثم يطبعها -

awk ' { print $(--NF)}' file

أو

rev file|cut -d ' ' -f2|rev

إذا كان لديك العديد من الأعمدة وترغب في طباعة كل المجموعات الثلاثة وليس الأخيرة ، فقد يساعد ذلك

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'


إنها أبسط:

 awk '{print $--NF}' 

السبب الذي لم يعمل به $NF-- الأصلي هو أن التعبير تم تقييمه قبل الانخفاض ، بينما يتم تنفيذ $NF-- prefix قبل التقييم.


حل بيرل شبيه بمحلول كريس كانون الفضي:

perl -lane 'print $F[$#F-1]' file

يتم استخدام خيارات سطر الأوامر التالية:

  • n حلقة حول كل سطر من ملف الإدخال ، لا تطبع تلقائيا كل سطر

  • l يزيل الخطوط الجديدة قبل المعالجة ، ويضيف لهم مرة أخرى بعد ذلك

  • وضع autosplit - خطوط الإدخال المقسمة إلى مجموعة @F افتراضيات لتقسيم على مسافة بيضاء

  • e تنفيذ رمز بيرل

يبدأ صفيفة autosplitF في الفهرس [0] بينما تبدأ حقول awk بـ $ 1.
$#F هو عدد العناصر في @F


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

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11

awk ' { print ( $(NF-1) ) }' file