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
出現し、それ以外の場合は機能しません。$1
historical
$4
または、ツールを使って、フィールドを使用して区切ることで、sort
一意の ( ) 行を要求します。BSD と GNU の両方のバリアントで動作します。-u
_
1-4
sort
sort -u -t_ -k1,4 < file