частичная уникальность строк в файле — сохраняется только первая доступная строка

частичная уникальность строк в файле — сохраняется только первая доступная строка

У меня есть файл, my_file.txtкоторый содержит следующие строки:

tasmax_day_ACCESS_historical_r1i1p1f3_gn.nc
tasmax_day_EC-Earth3_historical_r1i1p1f1_gn.nc
tasmax_day_EC-Earth3_historical_r1i1p1f1_gr.nc
tasmax_day_EC-Earth3_historical_r1i1p1f3_gn.nc
tasmax_day_HadGEM-MM_historical_r1i1p1f1_gn.nc
tasmax_day_HadGEM-MM_historical_r1i1p1f1_gr.nc
tasmax_day_HadGEM-MM_historical_r3i1p1f1_gn.nc
tasmax_day_MIROC_historical_r1i1p1f1_gn.nc
tasmax_day_MIROC_historical_r2i1p1f1_gn.nc

Мне нужно выполнить операцию uniqueнад подстрокой, начинающейся с tasmaxend и заканчивающейся , при _historicalэтом для каждой такой подстроки я бы сохранил только ту содержащую ее строку, которая идет первой в алфавитном порядке.

Мой ожидаемый результат my_file.txtследующий:

tasmax_day_ACCESS_historical_r1i1p1f3_gn.nc
tasmax_day_EC-Earth3_historical_r1i1p1f1_gn.nc
tasmax_day_HadGEM-MM_historical_r1i1p1f1_gn.nc
tasmax_day_MIROC_historical_r1i1p1f1_gn.nc

Спасибо за любую помощь.

решение1

Достаточно простого Awk. Сформируйте хэш-карту, ключом которой будет уникальная строка идентификатора, и выведите только эти строки

awk -F_ '{ key = $1 FS $2 FS $3 $4 } !unique[key]++ ' file

С разделителем, установленным на _, получить доступ к отдельным работам с помощью $1нотации и сформировать ключ до , включая $4. Выражение !unique[key]++будет ненулевым только в том случае, если ключ (сформированный) из строкинетуже видел.

Этотпредполагаетваша tasmaxстрока встречается в $1и historicalв $4и не работает в противном случае.


Или просто используйте sortинструмент, попросив его уникальны ( -u) строки, разграничивая их с _помощью полей 1-4. Работает как на BSD, так и на GNU sortвариантах

sort -u -t_ -k1,4 < file

Связанный контент