سؤال

أحاول إزالة العمودين الأولين (الذي لست مهتمًا بهما) من ملف سجل DbgView.لا يمكنني العثور على مثال يطبع من العمود 3 فصاعدًا حتى نهاية السطر.لاحظ أن كل سطر يحتوي على عدد متغير من الأعمدة.

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

المحلول

... أو أبسط حل: cut -f 3- INPUTFILE فقط إضافة محدد الصحيح (-d) وحصلت على نفس التأثير

نصائح أخرى

awk '{for(i=3;i<=NF;++i)print $i}' 

جوناثان فاينبرجتطبع إجابة كل حقل على سطر منفصل.يمكنك استخدام printf لإعادة بناء السجل للإخراج على نفس السطر، ولكن يمكنك أيضًا تحريك الحقول قفزة إلى اليسار.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file

ملحوظة: هذه الطريقة سوف يغادر "الفراغات" في 1،2،3 المجالات ولكنها ليست مشكلة إذا كنت تريد فقط أن ننظر إلى الناتج

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

وهذا بتقطيع ما قبل تقرير وطني مجال معين، N، ويطبع كل ما تبقى من الخط، بما في ذلك المجال nr.N والحفاظ على تباعد الأصلي (لا إعادة). فإنه لا الأم إذا كانت السلسلة الحقل يظهر أيضا في مكان آخر في الخط، وهو مشكلة مع الجواب daisaa ل.

وتحديد وظيفة:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

واستخدامها مثل هذا:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

والناتج يحافظ على كل شيء، بما في ذلك المسافات الزائدة

ويعمل بشكل جيد للملفات حيث '/ ن' هو فاصل سجل لذلك لم يكن لديك هذا شار الخط الجديد داخل خطوط. إذا كنت ترغب في استخدامه مع فواصل السجلات الأخرى ثم استخدام:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

وعلى سبيل المثال. يعمل بشكل جيد مع جميع الملفات تقريبا طالما أنها لا تستخدم عشري تقرير وطني شار. 1 داخل خطوط.

وماذا عن السطر التالي:

awk '{$1=$2=$3=""; print}' file

وبناء على اقتراح @ ghostdog74. الألغام ينبغي أن تتصرف على نحو أفضل عندما تقوم بتصفية الخطوط، أي بمعنى:.

awk '/^exim4-config/ {$1=""; print }' file

إذا كنت ترغب في طباعة الأعمدة بعد 3 على سبيل المثال في نفس الخط، يمكنك استخدام:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

وعلى سبيل المثال:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

ووسوف طباعة:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

وكما نرى، وقسيمة الدفع حتى مع الفضاء، ويظهر في الخط الصحيح.

وفيما يلي يطبع قيادة AWK مجالات N الأخيرة من كل سطر وفي نهاية السطر بطباعة حرف سطر جديد:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

والبحث أدناه مثال تسرد محتوى البيرة / الدليل / بن ومن ثم يحمل 3 خطوط الماضية ومن ثم يطبع 4 أعمدة الأخيرة من كل سطر باستخدام AWK:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

حسنا، يمكنك إنجاز بسهولة نفس التأثير باستخدام تعبير عادي. على افتراض الفاصل هو الفضاء، فإنه تبدو مثل:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

حل بيرل:

perl -lane 'splice @F,0,2; print join " ",@F' file

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

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

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

  • -a وضع التقسيم التلقائي – تقسيم خطوط الإدخال إلى مصفوفة @F.الإعدادات الافتراضية للتقسيم على مسافة بيضاء

  • -e تنفيذ كود بيرل

splice @F,0,2 يزيل الأعمدة 0 و1 بشكل نظيف من المصفوفة @F

join " ",@F يربط عناصر المصفوفة @F، باستخدام مسافة بين كل عنصر

إذا كان ملف الإدخال الخاص بك محددًا بفواصل، وليس بمسافات، فاستخدمه -F, -lane


حل بايثون:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

awk '{a=match($0, $3); print substr($0,a)}'

أولا عليك العثور على موقف من بداية العمود الثالث. مع SUBSTR سوف طباعة خط كامل ($ 0) بدءا من الموضع (في هذه الحالة) إلى نهاية السطر.

وA متأخرا بعض الشيء هنا، ولكن لا شيء مما سبق يبدو للعمل. جرب هذا، وذلك باستخدام printf، إدراج مسافات بين كل. لقد اخترت أن لا يكون السطر الجديد في نهاية المطاف.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

وطباعة السجلات بدءا من حقل 4TH إلى الحقل الأخير في نفس الترتيب كانوا في الملف الأصلي

في باش يمكنك استخدام بناء الجملة التالية مع معلمات الموضعية:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

ومعرفة المزيد: معالجة معلمات الموضعية في باش قراصنة المعرفة

إذا بها فقط حول تجاهل المجالين الأول وإذا كنت لا ترغب في الفضاء عندما اخفاء تلك الحقول (مثل بعض الإجابات القيام أعلاه):

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

ويتم مسح الأولى عمودين، sed يزيل المسافات البادئة.

في الأعمدة AWK تسمى المجالات، وبالتالي NF هو مفتاح

وكافة الصفوف:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

والصف الأول فقط:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top