Comment faire pour générer une séquence de dates de début et de fin dates à l'aide de AWK des scripts BASH?
J'ai un jeu de données avec le format suivant
Les premier et second champs d'indiquer la date (M/D/YYYY) de début et de fin de l'étude.
Comment développer les données dans le format de sortie souhaité, en tenant compte des années bissextiles à l'aide de AWK ou scripts BASH?
Votre aide est très apprécié.
Entrée
7/2/2009 7/7/2009
2/28/1996 3/3/1996
12/30/2001 1/4/2002
De Sortie Désiré
7/7/2009
7/6/2009
7/5/2009
7/4/2009
7/3/2009
7/2/2009
3/3/1996
3/2/1996
3/1/1996
2/29/1996
2/28/1996
1/4/2002
1/3/2002
1/2/2002
1/1/2002
12/31/2001
12/30/2001
Vous devez vous connecter pour publier un commentaire.
Si vous avez
gawk
:Démonstration:
De sortie:
Edit:
Le script ci-dessus souffre d'une hypothèse naïve au sujet de la longueur des jours. C'est un mineur nit, mais elle ne peut produire des résultats inattendus dans certaines circonstances. Au moins une autre réponse ici aussi a ce problème. Sans doute, la
date
de commande avec la soustraction (ou d'ajouter) un certain nombre de jours n'ont pas ce problème.De réponses à certaines questions nécessitent que vous savez le nombre de jours à l'avance.
Voici une autre méthode qui, espérons-le, répond à ces préoccupations:
Il peut être fait gentiment avec bash seul:
ou avec des tuyaux:
seq 1 5 | xargs -I {} date -d "{} days ago" +%Y-%m-%d
seq
etdate -d
sont GNUisms. Sur *BSD (y compris Mac OS x), vous pouvez vouloirjot
etdate -j
à la place. Pour la portabilité, j'aurais peut-saut à Awk ou Perl.seq 1 5 | xargs -I {} date -d "now -{} days" +%Y-%m-%d
seq 5 -1 0 | xargs -I {} date -d "now -{} days" +%Y-%m-%d
Vous pouvez le faire dans le shell sans awk, en supposant que vous avez GNU date (qui est nécessaire pour la
date -d @nnn
forme, et, éventuellement, la capacité de la bande de zéros sur un chiffre, jours et mois):Si vous êtes dans les paramètres régionaux qui ne l'heure d'été, alors cela peut se faire massacrer si vous demandez une date de séquence où l'heure d'été à commutation se produit entre les deux. Utilisez -u pour la force de l'UTC, qui a également respecte strictement 86400 secondes par jour. Comme ceci:
Vient nourrir cette part de vos commentaires sur stdin.
La sortie de vos données est:
date_script.sh
script.brew install coreutils
) et en cours d'exécution gdate au lieu de la date.seq -f '%.f'
Je préfère le format ISO 8601 dates - voici une solution avec eux.
Vous pouvez adapter assez facilement à l'Américaine format si vous le souhaitez.
Script AWK
Appeler ce fichier: dates.awk
Données
Appeler ce fichier: dates.txt
Résultats
Commande exécutée:
De sortie:
daylist='31 28 ... 30 31'; split(daylist,days)
#!/usr/bin/awk -f
shebang en haut, ou de l'invoquer à l'awk -f
vous-même.Une autre option est d'utiliser dateseq de dateutils (http://www.fresse.org/dateutils/#dateseq).
-i
change le format d'entrée et de-f
change le format de sortie.-1
doit être spécifié comme un incrément lors de la première date est postérieure à la deuxième date.