ファイル内で部分的に一意の文字列 - 最初に使用可能な文字列のみが保持されます。

ファイル内で部分的に一意の文字列 - 最初に使用可能な文字列のみが保持されます。

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

endで始まる部分文字列を実行する必要があり、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

おすすめ記事