كيفية طباعة العمود الثالث إلى العمود الأخير؟
-
05-07-2019 - |
سؤال
أحاول إزالة العمودين الأولين (الذي لست مهتمًا بهما) من ملف سجل DbgView.لا يمكنني العثور على مثال يطبع من العمود 3 فصاعدًا حتى نهاية السطر.لاحظ أن كل سطر يحتوي على عدد متغير من الأعمدة.
المحلول
... أو أبسط حل: cut -f 3- INPUTFILE
فقط إضافة محدد الصحيح (-d) وحصلت على نفس التأثير
نصائح أخرى
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
وجدت الحل هنا:
HTTP: //www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
جوناثان فاينبرجتطبع إجابة كل حقل على سطر منفصل.يمكنك استخدام 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>