shell - كيفية طباعة جميع الأعمدة بعد رقم معين باستخدام awk؟
(7)
عموما بيرل يستبدل awk / sed / grep et. القاعدة ، وأكثر من ذلك بكثير المحمولة (وكذلك مجرد كونها أفضل penknife).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi ينطبق بالطبع.
على القشرة ، أنا الأنابيب إلى awk عندما أحتاج إلى عمود معين.
هذا يطبع العمود 9 ، على سبيل المثال:
... | awk '{print $9}'
كيف يمكنني أن أقول awk لطباعة جميع الأعمدة بما في ذلك وبعد العمود 9 ، وليس فقط العمود 9؟
عندما تريد القيام بمجموعة من المجالات ، لا تملك awk
طريقة مباشرة للأمام للقيام بذلك. أود أن أوصي cut
بدلا من ذلك:
cut -d' ' -f 9- ./infile
تصحيح
وأضاف حقل الفضاء المحدد بسبب التقصير كونها علامة التبويب. شكراً لـ Glenn للإشارة إلى ذلك
لعرض الحقول الثلاثة الأولى وطباعة الحقول المتبقية التي يمكنك استخدامها:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
حيث $ 1 $ 2 $ 3 هي أول 3 حقول.
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
هذا يقطع ما هو قبل حقل الحقل المعطى ، N ، ويطبع كل ما تبقى من الخط ، بما في ذلك nr.N الحقل والمحافظة على التباعد الأصلي (لا يتم إعادة تهيئته). انها لا ماتر إذا ظهرت سلسلة من الحقل أيضا في مكان آخر في السطر ، وهي مشكلة مع جواب Ascherer.
تحديد وظيفة:
fromField () {
awk -v m="\x01" -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
يحافظ الإخراج على كل شيء ، بما في ذلك المسافات الزائدة بالنسبة إلى N = 0 ، فإنه يقوم بإرجاع السطر بالكامل ، كما هو ، وبالنسبة إلى n> NF السلسلة الفارغة
function print_fields(field_num1, field_num2){
input_line = $0
j = 1;
for (i=field_num1; i <= field_num2; i++){
$(j++) = $(i);
}
NF = field_num2 - field_num1 + 1;
print $0
$0 = input_line
}
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
بدلاً من التعامل مع whitespace العرض المتغير ، استبدل كل المسافات البيضاء كمسافة مفردة. ثم استخدم cut
بسيط مع المجالات ذات الاهتمام.
لا يستخدم awk حتى لا ينتمي إلى الآباء ولكن يبدو مناسبا في ضوء الإجابات / التعليقات الأخرى.