Сортировка строк и удаление всех строк, кроме одной, на основе последней строки? - PullRequest
0 голосов
/ 30 мая 2019

в поисках решения моей проблемы я нашел эту ветку: Сортировка по последнему полю строки

Я использовал некоторые решения для сортировки с использованием sed и awk иони работают, еще одна вещь, которая мне нужна, это удалить все, кроме одной строки на основе последней строки в строке.

Пример, у меня есть:

www.site.com/324242_1234
www.site.com/233_1234
www.site.com/45357_1234
www.site.com/6545_2345
www.site.com/5433_2345
www.site.com/87745_456
www.site.com/453209_456
www.site.com/1345_456

Нужен этот результат:

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

Поэтому мне нужно сохранить только одну строку, содержащую эту последнюю строку, в этом примере они разделены подчеркиванием.Я ценю помощь.

Ответы [ 3 ]

2 голосов
/ 30 мая 2019
$ sort -t_ -u -k2 file

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

предполагает отсутствие предшествующих подчеркиваний.

awk решение может быть

$ awk -F_ '!a[$NF]++' file

www.site.com/324242_1234
www.site.com/6545_2345
www.site.com/87745_456

Пояснение После установки разделителя полей, $NFссылается на последнее поле, a[$NF]++ подсчитывает вхождения каждого значения, начиная с нуля.!a[$NF]++ отрицает значение, поэтому оно будет истинным, только когда счетчик равен нулю, что является первым экземпляром значения ключа, которое просматривалось.На этом сайте есть много примеров этой awk идиомы.

1 голос
/ 30 мая 2019
awk -F[_/] '{print $NF,$(NF-1),$0}' input_file |sort -r -nk2,1   |awk '!a[$1]++{gsub($1FS$2,"");gsub(/^ /,"");print}'
www.site.com/87745_456
www.site.com/6545_2345
www.site.com/45357_1234
1 голос
/ 30 мая 2019

Как насчет этого?

cat file | sed -e 's/_/\t/gi' | sort -uk 2,2 | sed -e 's/\t/_/gi'

Где file содержит строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...