ファイル内の文字列の部分的な一意性 - 最初の文字列のみ使用可能にする

ファイル内の文字列の部分的な一意性 - 最初の文字列のみ使用可能にする

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_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出現し、それ以外の場合は機能しません。$1historical$4


または、ツールを使って、フィールドを使用して区切ることで、sort一意の ( ) 行を要求します。BSD と GNU の両方のバリアントで動作します。-u_1-4sort

sort -u -t_ -k1,4 < file

関連情報