parcial exclusivo em strings dentro do arquivo - mantém apenas a primeira string disponível

parcial exclusivo em strings dentro do arquivo - mantém apenas a primeira string disponível

Eu tenho um arquivo chamado my_file.txtque contém as seguintes strings:

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

Eu preciso executar uma uniquesubstring começando com tasmaxend terminando em _historicalonde para cada substring eu manteria apenas a linha que contém a que vem primeiro em ordem alfabética.

Minha saída esperada my_file.txté a seguinte:

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

Obrigado por qualquer ajuda.

Responder1

Um simples Awk seria suficiente. Forme um mapa hash, codificado pela string do identificador exclusivo e imprima apenas essas linhas

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

Com o delimitador definido como _, acesse as obras individuais por $1notação e forme a chave até incluir $4. A expressão !unique[key]++será diferente de zero somente se a chave (formada) da linha fornãojá visto.

Esseassumesua tasmaxstring ocorre at $1e historicalat $4e não funciona de outra forma.


Ou apenas use a sortferramenta, solicitando -ulinhas exclusivas ( ) delimitando o _uso de campos 1-4. Funciona em sortvariantes BSD e GNU

sort -u -t_ -k1,4 < file

informação relacionada