سؤال

أريد تطبيق الأمر "awk" التالي على الملفات مع الامتداد "*.txt"

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'

لكن لماذا لا يعمل هذا الأمر:

for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done

عادة،

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt

ستعمل.

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

المحلول

بمجرد إزالة الصدى ، يجب أن يعمل:

for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done

سوف تفشل إذا كان هناك أي ملفات نصية بها مسافات فيها ، يمكنك تجربة ذلك:

find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'

بديل لطباعة الأسماء:

find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;

(اجعل العثور على تنفيذ OWK بشكل أساسي ، لذلك وكذلك طباعة أسماء الملفات.

نصائح أخرى

for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done

سيؤدي ذلك إلى طباعة أسماء الملفات المعالجة مع إخراج awk يأمر.

جرب هذا (استخدم نوك أو /usr/xpg4/bin/awk على سولاريس):

awk 'END {
  printf "%s: %.2f\n", fn, sum
  }
FNR == 1 {
  if (fn) printf "%s: %.2f\n", fn, sum
  fn = FILENAME
  sum = 0
  }
$4 ~ /NM/ { 
  sum += $2 
  }' *.txt 

تحتاج إلى إضافة "؛" :

for i in *.txt; do ...

بدلاً من

for i in *.txt do ...

الصدى غير مطلوب.

محاولة

لأني في *.txt ؛ فعل؛ awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i ؛ فعله

أو

لأني في *.txt ؛ do awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i ؛ فعله

يجب أن تعمل

لست متأكدًا مما إذا كنت قد قمت بنسخ لصق أو خطأ مطبعي.

لأني في *.txt تفعل صدى صوت awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i ؛ فعله

مع تصحيح ECHO ، سيقوم الأمر أعلاه بتردد نص OWK الخاص بك واسم الملف ، ولكن لا يتم تشغيله.

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