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 حتى لا ينتمي إلى الآباء ولكن يبدو مناسبا في ضوء الإجابات / التعليقات الأخرى.







awk