
Ich habe eine Datei namens my_file.txt
, die die folgenden Zeichenfolgen enthält:
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
Ich muss eine Operation unique
für die Teilzeichenfolge durchführen, die mit „ tasmax
Ende“ beginnt und auf „Ende“ endet. Dabei _historical
behalte ich für jede Teilzeichenfolge nur die Zeile, die sie enthält und in alphabetischer Reihenfolge an erster Stelle steht.
Meine erwartete Ausgabe my_file.txt
ist die folgende:
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
Vielen Dank für jede Hilfe.
Antwort1
Ein einfaches Awk würde genügen. Bilden Sie eine Hash-Map, die durch die eindeutige Identifikationszeichenfolge als Schlüssel gekennzeichnet ist, und drucken Sie nur die Zeilen
awk -F_ '{ key = $1 FS $2 FS $3 $4 } !unique[key]++ ' file
Wenn das Trennzeichen auf gesetzt ist _
, greifen Sie auf die einzelnen Werke nach $1
Notation zu und bilden den Schlüssel bis einschließlich $4
. Der Ausdruck !unique[key]++
ist nur dann ungleich Null, wenn der (aus der Zeile gebildete) Schlüssel istnichtschon gesehen.
Dasgeht davon ausIhre tasmax
Zeichenfolge kommt bei $1
und historical
bei vor $4
und funktioniert ansonsten nicht.
Oder verwenden Sie einfach das sort
Tool, indem Sie es auf eindeutige ( -u
) Zeilen beschränken, indem _
Sie die Felder verwenden 1-4
. Funktioniert sowohl auf BSD- als auch auf GNU- sort
Varianten
sort -u -t_ -k1,4 < file