Устранить частично повторяющиеся строки по столбцам и сохранить последние - PullRequest
24 голосов
/ 25 марта 2011

У меня есть файл, который выглядит так:

2011-03-21 name001 line1
2011-03-21 name002 line2
2011-03-21 name003 line3
2011-03-22 name002 line4
2011-03-22 name001 line5

для каждого имени, я хочу только его последнее появление.Итак, я ожидаю, что результат будет:

2011-03-21 name003 line3
2011-03-22 name002 line4
2011-03-22 name001 line5

Может кто-нибудь дать мне решение с bash / awk / sed?

Ответы [ 4 ]

39 голосов
/ 25 марта 2011

Этот код получает уникальные строки по второму полю, но из конца файла или текста (как в примере с вашим результатом)

tac temp.txt | sort -k2,2 -r -u
11 голосов
/ 25 марта 2011
awk '{a[$2]=$0} END {for (i in a) print a[i]}' file

Если важен порядок появления:

  • На основании первого появления:

    awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}' file
    
  • На основанииПоследнее появление:

    tac file | awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}'
    
6 голосов
/ 23 июня 2011
sort < bar > foo
uniq  < foo > bar

бар теперь не имеет повторяющихся строк

4 голосов
/ 25 марта 2011

РЕДАКТИРОВАТЬ: Вот версия, которая действительно отвечает на вопрос.

sort -k 2 filename | while read f1 f2 f3; do if [ ! "$f2" = "$lf2" ]; then echo "$f1 $f2 $f3"; lf2="$f2"; fi; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...