У меня есть тысячи данных как это:
abc_1
abc_2
abc_3
abc_4
def_1
def_2
def_3
ghi_1
ghi_2
Я хочу отфильтровать его для получения только данных с самым большим количеством, которое является abc_4, def_3, ghi_2
.
Как я могу получить его?
Используя 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