2013-05-29 2 views
1

У меня есть 2 поля в файле ниже.выбрать уникальную нижнюю строку в unix

Поле 1 - это имя и поле 2 - дата операции.

Я хочу уникальное имя с датой сделки самая низкая

cat abc.lst 
John_20130201 
David_20130202 
Scott_20130203 
Li_20130201 
John_20130202 
Scott_20130201 
David_20130201 
Li_20130204 
Torres_20121231 

выход желаемого

John_20130201 
Li_20130201 
Scott_20130201 
David_20130201 
Torres_20121231 
+0

как сортируется результат? или порядок не имеет значения? – Kent

ответ

4
sort -t_ -nk2 abc.lst | awk -F_ '!a[$1]++' 

или сохранить трубу и сделать это -

awk -F_ '!a[$1]++' <(sort -t_ -nk2 abc.lst) 
+0

+1! хорошая комбинация, хотя 2 процесса. – Kent

0
awk -F_ '{ l = lowest[$1]; if (!l || $2 < l) { lowest[$1] = $2 } } 
     END { for (name in lowest) print name FS lowest[name] }' 

(если порядок вывода не имеет значения)

-2

Используйте команду sort :

cat abc.lst | sort -u -t_ -k1,1 

И об этом читайте на man sort

+0

Упс, я не читал тег 'awk'. – ramonovski

+0

Ну, был также тег 'bash'. Во всяком случае, я бы заменил 'cat abc.lst |' на ' Arkku

+0

Помимо бесполезной кошки, ваш вид не работает должным образом. – Kent

0

это один вкладыш выбирает те записи. но не сортирует вывод:

awk -F_ '$1 in a{a[$1]=$2>a[$1]?a[$1]:$2;next}{a[$1]=$2} 
END{for(x in a)print x"_"a[x]}' file 
+1

Первая строка в более компактной форме '! A [$ 1] || a [$ 1]> $ 2 {a [$ 1] = $ 2}'. – TrueY

+0

@TrueY Thats симпатичный пятно !! –

+0

@Jaypal: THX! ;) На самом деле я переосмыслил свой код 'bash'. – TrueY

0

bash чистого раствора (не упорядоченный по имени):

declare -A hash 
while IFS=_ read nam val; do 
    [[ -z "${hash[$nam]}" || $val < "${hash[$nam]}" ]] && hash[$nam]=$val 
done <abc.lst 

for i in ${!hash[*]}; do echo ${i}_${hash[$i]}; done 

Выход:

David_20130201 
Li_20130201 
John_20130201 
Scott_20130201 
Torres_20121231 
Смежные вопросы