Je n’ai pas pu trouver de solution pour supprimer conditionnellement une ligne dans un fichier en utilisant bash. Le fichier contient les dates de l’année dans les chaînes et la ligne correspondante ne doit être supprimée que si l’année est inférieure à une valeur de référence.
Le fichier ressemble à ceci:
'zg_Amon_MPI-ESM-LR_historical_r1i1p1_196001-196912.nc' 'MD5' 'zg_Amon_MPI-ESM-LR_historical_r1i1p1_197001-197912.nc' 'MD5' 'zg_Amon_MPI-ESM-LR_historical_r1i1p1_198001-198912.nc' 'MD5' 'zg_Amon_MPI-ESM-LR_historical_r1i1p1_199001-199912.nc' 'MD5' 'zg_Amon_MPI-ESM-LR_historical_r1i1p1_200001-200512.nc' 'MD5'
Je veux obtenir l’année 1969 de la ligne 1 et la comparer à une référence (disons 1980) et supprimer toute la ligne si l’année est inférieure à la référence. Cela signifie que dans ce cas, le code devrait supprimer les deux premières lignes du fichier.
J’ai essayé avec sed et grep, mais je ne pouvais pas le faire fonctionner.
Merci d’avance pour toute idée.
Vous pouvez utiliser awk
:
awk -F- '$4 > 198000 {print}' filename
Cela affichera toutes les lignes où la deuxième date est postérieure au 31/12/1979. Cela n’éditera pas le fichier sur place, vous devrez enregistrer la sortie dans un autre fichier, puis le déplacer à la place de l’original:
awk -F- '$4 > 198000 {print}' filename > tmp && mv tmp filename
Utiliser sed
(éditera sur place):
sed -i '/.*19[0-7][0-9]..\.nc/d' filename
Cela demande un peu plus de reflection, dans la mesure où vous devrez construire une expression régulière pour correspondre aux valeurs que vous ne souhaitez pas afficher.
Peut-être quelque chose comme ça:
awk -F- '{ if (substr($4,1,4) >= 1980) print }' input.txt