날짜가 포함된 파일이 있습니다.
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
및 은 -f
GNU 구현의 확장입니다 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
홈페이지에서 소스코드를 다운로드하여 빌드할 수 있습니다.