
У меня есть файл, 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
над подстрокой, начинающейся с tasmax
end и заканчивающейся , при _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