두 개의 텍스트 파일이 있습니다. 첫 번째 파일에는 시작 날짜 시간이 있고 두 번째 파일에는 종료 날짜 시간이 있습니다.
파일 1 데이터(시작 날짜-시간):
2019-01-08 04:14:59
2019-01-08 04:16:57
파일 2 데이터(종료 날짜-시간):
2019-01-08 04:15:50
2019-01-08 04:17:02
종료 시간(시작 시간만)에 작업을 수행할 Unix 스크립트가 필요합니다. 실행해야 하는 첫 번째 항목의 예:
04:15:50 - 04:14:59
결과를 초 단위로 제공합니다(이 예에서는 총 차이를 초 단위로 인쇄해야 합니다).
답변1
다음과 같은 크로스 플랫폼 명령줄 유틸리티 세트가 있습니다.날짜 도구여기에는 datediff
명령이 포함됩니다. Linux를 사용하는 경우 dateutils
패키지 관리자를 사용하여 설치했을 가능성이 높습니다.
Linux, Mac, BSD 또는 기타 Unix에서 이를 원하는지 여부를 명시하지 않았으므로 다음 사항을 필요에 맞게 조정해야 할 수 있지만 Arch Linux에서는 작동합니다.
$ paste start.txt end.txt | sed 's/ /T/g' | while read dates; do datediff $dates; done
51s
5s
설명하다
파이프라인은 두 부분, 즉 차이를 계산하기 위해 while read dates; do datediff $dates; done
입력을 제공하는 부분과 원시 데이터를 소비에 적합한 형식으로 전처리하는 부분 으로 구성되어 있다고 생각할 수 있습니다 .datediff
paste start.txt end.txt | sed 's/ /T/g'
datediff
특히, 제공한 예제 입력의 경우 공백 탈출에 대해 걱정해야 합니다. 데이터가 원래 형식으로 남아 있으면 datediff
파일의 각 공백이 별도의 매개변수를 나타내는 것으로 간주됩니다. 예를 들어 다음은 적합한 입력이 아닙니다.
$ paste start.txt end.txt
2019-01-08 04:14:59 2019-01-08 04:15:50
2019-01-08 04:16:57 2019-01-08 04:17:02
그래서 매뉴얼 ( )의 일부 예와 일치하도록 sed
공백(탭 아님)을 로 대체했습니다 .T
datediff
man datediff
$ paste start.txt end.txt | sed 's/ /T/g'
2019-01-08T04:14:59 2019-01-08T04:15:50
2019-01-08T04:16:57 2019-01-08T04:17:02
이제 데이터에는 예상 매개변수 사이에 공백만 있고 각 매개변수의 형식은 매뉴얼에 제공된 예와 일치합니다.
답변2
bash
GNU를 사용한 솔루션 date
:
#!/bin/bash
while IFS= read -r -u3 line1; do
IFS= read -r -u4 line2
start_date="$line1"
end_date="$line2"
difference=$(( $(date -d "$end_date" "+%s") - $(date -d "$start_date" "+%s") ))
echo "Start Date: $start_date; End Date: $end_date; Difference in seconds = $difference"
done 3<start-times.txt 4<end-times.txt
파일 설명자 3과 4는 두 파일에서 한 번에 한 줄씩 읽는 데 사용됩니다. 여기에서 GNU date 명령을 사용하여 이를 에포크 시간으로 변환합니다. Bash의 산술 확장은 차이를 계산하는 데 사용됩니다.
예제 출력:
Start Date: 2019-01-08 04:14:59; End Date: 2019-01-08 04:15:50; Difference in seconds = 51
Start Date: 2019-01-08 04:16:57; End Date: 2019-01-08 04:17:02; Difference in seconds = 5