bash를 사용하여 날짜 차이를 계산해야 합니다.

bash를 사용하여 날짜 차이를 계산해야 합니다.

날짜가 포함된 파일이 있습니다.

Mar 16
Mar 12
Mar 13
Mar 19
Mar 14
Mar 17

지금까지 경과된 일수를 계산해야 합니다. 나는 이 기능을 가지고 있습니다 :

datediff() {     
    d1=$(date -d "$1" +%s);     
    d2=$(date -d "$2" +%s);     
    echo $(( (d1 - d2) / 86400 )) days; 
}
$ datediff 'now' '13 Mar'
114 days

하지만 각 행을 계산하려면 루프가 필요합니다.

답변1

여기에는 쉘 루프가 필요하지 않습니다. 다음을 수행할 수 있습니다.

date -f file +%s |
  awk 'BEGIN{srand(); now = srand()}
       {print int((now - $0) / 86400), "days"}'

-d및 은 -fGNU 구현의 확장입니다 date. 로 Dec 31해석되니 참고해주세요Dec 31올해, 앞으로도.

쉘 루프를 사용하려는 경우 zsh또는 와 같은 날짜 조작 지원 기능이 내장된 쉘을 선호할 수 있습니다 ksh93.

이러한 타임스탬프를 과거( Oct 10예: 가장 가까운 10/10/00:00:00)로 해석하려면 다음을 사용하세요 zsh.

#! /bin/zsh -
zmodload zsh/datetime || exit

now=$EPOCHSECONDS
strftime -s year %Y "$now"
(( lastyear = year - 1 ))
while IFS= read -r day; do
  strftime -rs t '%Y %b %d' "$year $day" || continue
  (( t <= now )) || strftime -rs t '%Y %b %d' "$lastyear $day"
  print $(( (now - t) / 86400 ))
done < file

이 기능은 영어 약어 외에도 사용자의 월 이름 약어를 이해할 수 있는 이점도 있습니다.

답변2

while조건이 표준 입력에서 읽는 기능을 기반으로 하는 루프를 사용할 수 있습니다 .

$ cat input.txt
Mar 16
Mar 12
Mar 13
Mar 19
Mar 14
Mar 17
$ cat ex.sh
#!/bin/bash

datediff() {
    local d1="$(date -d "$1" +%s)"
    local d2="$(date -d "$2" +%s)"

    echo "$(( (d1 - d2) / 86400 )) days"
}

while read line; do
    datediff 'now' "${line}"
done < "${1}"
$ ./ex.sh input.txt
111 days
115 days
114 days
108 days
113 days
110 days

여기의 스크립트는 입력 파일이라는 하나의 매개변수를 사용합니다. 파일에서 한 줄을 읽을 수 있는 동안 datediff함수를 호출하고 now파일에서 읽은 내용을 함수에 전달합니다.line

답변3

안정적인 캘린더 지원을 추가하는 것은 어려운 문제이므로 전용 프로그램을 사용하는 것이 좋습니다. 운 좋게도 누군가가 우리를 위해 힘든 일을 해주었습니다.

~에서http://www.unixwiz.net/tools/datemath.html:

날짜에 대해 계산을 해야 하는 경우가 많습니다(예: "오늘 + 7일"). 하지만 전통적인 MM/DD/YYYY 형식에서는 이 작업이 매우 까다로울 수 있습니다(특히 쉘 스크립트의 경우). 이를 위해 우리는 명령줄이나 쉘 스크립트에서 이러한 기능을 수행할 수 있는 datemath 도구를 구축했습니다. 예:

$ datemath today + 5
06/23/2003

$ datemath '12/25/2003 - today'
188

$ datemath today + 5 weeks
07/25/2003

when will my machine be up for one year?
$ uptime
 11:09am  up 317 days, 15:38,  7 users,  load average: 0.16, 0.04, 0.01
$ datemath today + 365 - 317
10/24/2003

홈페이지에서 소스코드를 다운로드하여 빌드할 수 있습니다.

관련 정보