كيف يمكنني إزالة الخطوط المحددة مع برنامج نصي AWK؟

StackOverflow https://stackoverflow.com/questions/1646129

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا الأنابيب إخراج البرنامج من خلال بعض الأوامر AWK، وأنا تقريبا حيث أريد أن أكون. الأمر حتى الآن هو:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

وبت الأخير هو uniq الرجل الفقير، الذي لا يتوفر على هدفي. ونظرا للفرصة الأمر أعلاه ينتج الإخراج مثل هذا:

GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2

ما أود أن يكون هو هذا:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

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

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

المحلول

واستنادا إلى بلدي الإجابة ل حاجة مماثلة، وهذا السيناريو تبقي الامور في النظام ولا تتراكم مجموعة كبيرة. فإنه يطبع الخط وفقا لأعلى قيمة من كل مجموعة.

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}

نصائح أخرى

إذا كنت لا تحتاج إلى العناصر ليكون في نفس الترتيب كانوا الإخراج من myprogram، الأعمال التالية:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top