Как отфильтровать данные с самым большим количеством

У меня есть тысячи данных как это:

abc_1
abc_2
abc_3
abc_4
def_1
def_2
def_3
ghi_1
ghi_2

Я хочу отфильтровать его для получения только данных с самым большим количеством, которое является abc_4, def_3, ghi_2.

Как я могу получить его?

1
задан 12 March 2020 в 11:26

1 ответ

Используя awk, как подразумевается Вашими тегами:

$ awk -F_ '
    {m[$1] = $2 > m[$1] ? $2 : m[$1]} 
    END {OFS = FS; for(x in m) print x, m[x]}
  ' file | sort
abc_4
def_3
ghi_2

Если у Вас есть GNU awk> 4.0, можно сделать сортировку внутренне

$ awk -F_ '
    {m[$1] = $2 > m[$1] ? $2 : m[$1]} 
    END {
      OFS = FS; PROCINFO["sorted_in"] = "@ind_str_asc"; 
      for(x in m) print x, m[x]
    }
  ' file
abc_4
def_3
ghi_2

С другой стороны, если у Вас есть Miller, можно сделать groupwise макс. с помощью stat1 глагол:

$ mlr --nidx --fs _ stats1 -a max -f 2 -g 1 file
abc_4
def_3
ghi_2

или с GNU datamash

$ datamash -t_ groupby 1 max 2 < file
abc_4
def_3
ghi_2

или для Вашего определенного входа, предполагая, что строки префиксов являются фиксированной длиной, с помощью стандартных утилит sort и uniq:

$ sort -t_ -k1,1 -k2,2nr file | uniq -w4
abc_4
def_3
ghi_2
3
ответ дан 17 March 2020 в 00:04

Другие вопросы по тегам:

Похожие вопросы: