7
votes

Besoin d'obtenir les dates de tous les lundis en un an

Je dois trier les données sur une base hebdomadaire et tout ce que j'ai sont des dates dans un logfile. Par conséquent, trier les données par semaine, je voudrais créer une liste avec les dates de tous les lundis pour une année donnée. J'ai essayé de travailler quelque chose et la seule idée que j'ai actuellement consiste à utiliser NCAL avec l'année et le mois comme argument en boucle sur tous les mois et en extrayant tous les lundis. N'y a-t-il pas de manière plus efficace?


0 commentaires

5 Réponses :


1
votes

Vous pouvez obtenir le numéro de la semaine en cours à l'aide de la date . Peut-être que vous pouvez trier sur ce: xxx


1 commentaires

Pourquoi n'a-t-je pas pensé à cela, je peux convertir la date dans le logfile, puis la poubelle dans les semaines.



6
votes

Pour obtenir tous les lundis, en obtenant toutes les dates et en filtrant les lundis: XXX

Bien sûr, vous pouvez également prendre un lundi et continuer à incrémenter de 7 jours.


4 commentaires

pour i in SEQ 0 365 ; Date -d "2011-1-1-1 $ IAJE" | grep -q lund; Si [$? ]; Ensuite, date -d "2011-1-1-1 $ i jour" +% y-% m-% d; fi; fi; fait


Désolé, je n'ai pas fonctionné devrait être pour i dans SEQ 0 365 ; Date -d "2011-1-1-1 $ IAJE" | grep -q lund; Si [$? = 0]; Ensuite, date -d "2011-1-1-1 $ i jour" +% y-% m-% d; fi; fi; fait


Voici une version qui fonctionne sur Mac OS X et des bandes le jour potentiellement indésirable de la semaine: pour I dans `SEQ 0 365`; Date -v + $ {i} d + '% a% m-% d'; fait | sed -n "s / ^ lun // p"


Pour le faire en incrémentant au lieu de grepping, trouvez le décalage jusqu'au lundi prochain (ici 3) alors: pour i in `SEQ 3 7 365` etc.



3
votes

J'espère que c'est ce que tu veux dire. Ci-dessous peut être modifié pour varier les formats de sortie des dates.

La commande date peut être utilisée pour cela, Dunno si NCAL est plus / moins efficace.

Je sais que vous êtes allé "Binning" maintenant , mais voici un v. xxx


4 commentaires

Merci, la sortie est exactement ce que je veux. C'est plutôt complexe de comprendre.


La lisibilité est également la merde que vous devriez envisager de commenter le code. -1.


Pourquoi, une doublure sans commentaire, ce qui n'est jamais une bonne solution si, quiconque pose la question, ne comprenez rien de ce que vous avez fait. Et j'ai déjà enlevé le -1.


@Anders j'ai reçu votre commentaire la seconde que j'ai soumis la version complète, lol



3
votes

Pas besoin de itérus sur tous les 365 ou 366 jours de l'année. Le suivant exécute date code> au plus 71 fois.

2011-01-03
2011-01-10
2011-01-17
2011-01-24
2011-01-31
2011-02-07
2011-02-14
2011-02-21
2011-02-28
2011-03-07
. . .
2011-11-28
2011-12-05
2011-12-12
2011-12-19
2011-12-26


1 commentaires

Punaise. Depuis quelques années, la dernière semaine commencera l'année suivante. Le décalage est assimilé à tort à ce jour dans la dernière section. Changer pour ((w = d; w <= $ (date -d "$ y-12-31" "+% j '); w + = 7)) to pour ( (w = d; w <= ($ (date -d "$ y-12-31" +% j ') - 1); w + = 7))



2
votes

Une autre option que je suis arrivée en fonction des réponses ci-dessus. La date de début et de fin peut maintenant être spécifiée.

#!/bin/bash

datestart=20110101
dateend=20111231

for tmpd in {0..6}
do
  date -d "$datestart $tmpd day" | grep -q Mon
  if [ $? = 0 ];
  then
    break
  fi
done

for ((tmpw = $tmpd; $(date -d "$datestart $tmpw day" +%s) <= $(date -d "$dateend" +%s); tmpw += 7))
do
  echo `date -d "$datestart $tmpw day" +%d-%b-%Y`
done


0 commentaires