تطبيق awk على مجموعة من الملفات بنفس الامتداد
-
05-07-2019 - |
سؤال
أريد تطبيق الأمر "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 الخاص بك واسم الملف ، ولكن لا يتم تشغيله.