sort | uniq -d
не удаляет дубликаты, а печатает по одной из каждого пакета строк, которые являются дубликатами. Вероятно, вам следует использовать sort -u
вместо - , что удалит дубликаты.
Но чтобы ответить на ваш вопрос:
$ awk '{print length($0), $0}' file | sort -k1,1rn | awk '!seen[$2]++' | cut -d' ' -f2-
PNUM-1234: [App] [Tracker] Text 123 ssd vp
PNUM-1236: [App] [Tracker] Text ddfg
PNUM-1235: [App] [Tracker] Text 1dbg
PNUM-1233: [App] [Tracker] Text
Первая команда awk
просто добавляет каждую строку с ее длиной, чтобы последующий sort
мог отсортировать все строки в первую очередь, затем второй awk
выводит строку только тогда, когда это первое вхождение значения ключевого поля (которое теперь является самой длинной строкой с этим значением ключа), а затем cut
удаляет длину строки, добавленную первым awk
.
Последовательно:
$ awk '{print length($0), $0}' file
31 PNUM-1233: [App] [Tracker] Text
31 PNUM-1233: [App] [Tracker] Text
39 PNUM-1236: [App] [Tracker] Text ddfg
36 PNUM-1236: [App] [Tracker] Text ddfg
39 PNUM-1234: [App] [Tracker] Tex 123 ssd
38 PNUM-1235: [App] [Tracker] Text 1dbg
42 PNUM-1234: [App] [Tracker] Text 123 ssd vp
$
$ awk '{print length($0), $0}' file | sort -k1,1rn
42 PNUM-1234: [App] [Tracker] Text 123 ssd vp
39 PNUM-1234: [App] [Tracker] Tex 123 ssd
39 PNUM-1236: [App] [Tracker] Text ddfg
38 PNUM-1235: [App] [Tracker] Text 1dbg
36 PNUM-1236: [App] [Tracker] Text ddfg
31 PNUM-1233: [App] [Tracker] Text
31 PNUM-1233: [App] [Tracker] Text
$
$ awk '{print length($0), $0}' file | sort -k1,1rn | awk '!seen[$2]++'
42 PNUM-1234: [App] [Tracker] Text 123 ssd vp
39 PNUM-1236: [App] [Tracker] Text ddfg
38 PNUM-1235: [App] [Tracker] Text 1dbg
31 PNUM-1233: [App] [Tracker] Text
$
$ awk '{print length($0), $0}' file | sort -k1,1rn | awk '!seen[$2]++' | cut -d' ' -f2-
PNUM-1234: [App] [Tracker] Text 123 ssd vp
PNUM-1236: [App] [Tracker] Text ddfg
PNUM-1235: [App] [Tracker] Text 1dbg
PNUM-1233: [App] [Tracker] Text
Вы не сказали, какую строку печатать если несколько строк для одного и того же значения ключа имеют одинаковую длину, то приведенное выше будет просто выводить одну из них случайным образом. Если это проблема, вы можете использовать сортировку GNU и добавить аргумент -s
(для stable sort
) или изменить командную строку на awk '{print length($0), NR, $0}' file | sort -k1,1rn -k2,2n | awk '!seen[$3]++' | cut -d' ' -f3-
- в обоих случаях это обеспечит вывод строки в таком конфликте первым. тот, который присутствовал во входных данных.