
Eu tenho um arquivo chamado my_file.txt
que 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 unique
substring começando com tasmax
end terminando em _historical
onde 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 $1
notaçã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 tasmax
string ocorre at $1
e historical
at $4
e não funciona de outra forma.
Ou apenas use a sort
ferramenta, solicitando -u
linhas exclusivas ( ) delimitando o _
uso de campos 1-4
. Funciona em sort
variantes BSD e GNU
sort -u -t_ -k1,4 < file