parcial único en cadenas dentro del archivo: mantenga solo la primera cadena disponible

parcial único en cadenas dentro del archivo: mantenga solo la primera cadena disponible

Tengo un archivo llamado my_file.txtque contiene las siguientes cadenas:

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

Necesito realizar una uniquesubcadena que comience con tasmaxel final y termine en _historicaldonde, para cada subcadena, mantendría solo la línea que la contiene y que aparece primero en orden alfabético.

Mi resultado esperado my_file.txtes el siguiente:

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

Gracias por cualquier ayuda.

Respuesta1

Un simple Awk sería suficiente. Forme un mapa hash, codificado por la cadena de identificador único e imprima solo esas líneas

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

Con el delimitador establecido en _, acceda a las obras individuales por $1notación y forme la clave hasta incluir $4. La expresión !unique[key]++será distinta de cero sólo si la clave (formada) a partir de la línea esnoya visto.

Esteasumesu tasmaxcadena ocurre en $1y historicalen $4y no funciona de otra manera.


O simplemente use la sortherramienta, pidiéndole que establezca -ulíneas únicas ( ) delimitando los _campos de uso 1-4. Funciona en sortvariantes BSD y GNU

sort -u -t_ -k1,4 < file

información relacionada