2015-12-30 2 views
-1

J'ai besoin d'aide pour soustraire chaque date venant dans chaque 3e ligne de la prochaine date à venir dans chaque quatrième ligne. Voir ci-dessous une partie de fichier ..Shell script pour sous-date date

Name: John 
Category: Subscriber 
4/6/14 8:00 PM 
4/6/17 7:59 PM 
Name: Hari 
Category: Owner 
4/22/13 6:29 AM 
6/21/32 6:29 AM 
Name: Bob 
Category: Subscriber 
9/9/14 8:00 PM 
9/9/17 7:59 PM 

fichier résultant doit être:

Name: John 
Category: Subscriber 
4/6/14 8:00 PM 
4/6/17 7:59 PM 
valid for 1095 days 
Name: Hari 
Category: Owner 
4/22/13 6:29 AM 
6/21/32 6:29 AM 
valid for 7361 days 
Name: Bob 
Category: Subscriber 
9/9/14 8:00 PM 
9/9/17 7:59 PM 
valid for 1095 days 
+1

Montrez ce que vous avez essayé ou ce que vous avez des idées –

Répondre

1

Vous pouvez utiliser une boucle for et faire le calcul de date à l'aide date -d:

#!/bin/bash 

i=0 
while read -r; do 
    ((++i)) 
    echo "$REPLY" 
    (((i+1) % 4 == 0)) && d="$REPLY" 
    ((i % 4 == 0)) && printf "valid for %d days\n" \ 
      $((($(date -d "$REPLY" '+%s') - $(date -d "$d" '+%s'))/86400)) 
done < file 

Sortie:

Name: John 
Category: Subscriber 
4/6/14 8:00 PM 
4/6/17 7:59 PM 
valid for 1095 days 
Name: Hari 
Category: Owner 
4/22/13 6:29 AM 
6/21/32 6:29 AM 
valid for 7000 days 
Name: Bob 
Category: Subscriber 
9/9/14 8:00 PM 
9/9/17 7:59 PM 
valid for 1095 days 
0

Avec perl:

perl -MTime::Piece -MTime::Seconds -lpe ' 
    sub diff_time { 
     print "valid for ", int(($d2->epoch - $d1->epoch)/ONE_DAY), " days"; 
    } 
    s/^\s+|\s+$//g; # trim whitespace 
    $d1 = Time::Piece->strptime($_, "%m/%d/%y %I:%M %p") if $. % 4 == 3; 
    $d2 = Time::Piece->strptime($_, "%m/%d/%y %I:%M %p") if $. % 4 == 0; 
    diff_time if $. % 4 == 1 and $. > 1; 
    END {diff_time} 
' file