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? P>
5 Réponses :
Vous pouvez obtenir le numéro de la semaine en cours à l'aide de la date code>. Peut-être que vous pouvez trier sur ce:
Pourquoi n'a-t-je pas pensé à cela, je peux convertir la date dans le logfile, puis la poubelle dans les semaines.
Pour obtenir tous les lundis, en obtenant toutes les dates et en filtrant les lundis: Bien sûr, vous pouvez également prendre un lundi et continuer à incrémenter de 7 jours. P> p>
pour i in code> 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 code>
Désolé, je n'ai pas fonctionné devrait être pour i dans code> 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 code>
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" code>
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` code> etc.
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. P>
Je sais que vous êtes allé "Binning" maintenant , mais voici un v. p>
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
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
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)) code> to
pour ( (w = d; w <= ($ (date -d "$ y-12-31" +% j ') - 1); w + = 7)) code>
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