쉼표로 구분된 세 개의 열(이름, 성, 생년월일)로 구성된 CSV 파일을 가져와 동일한 입력으로 다른 CSV 파일을 출력하는 bash/awk/sed 스크립트를 만드는 데 문제가 있습니다. 추가 열에는 다음이 표시됩니다. 현재 날짜와 생년월일의 연도 차이.
$ yourscript <input CSV file> <output CSV file>
input.csv
다음과 같이 보일 수 있습니다.bob,wag,06/13/1958 ashley,hay,01/23/1983 evan,bert,09/11/1972
output.csv
다음과 같아야 합니다.bob,wag,06/13/1958,62 ashley,hay,01/23/1983,37 evan,bert,09/11/1972,48
답변1
$ cat data
bob,wag,06/13/1958
ashley,hay,01/23/1983
evan,bert,09/11/1972
이름이 지정된 파일로 출력 output-file
하고 동시에 STDOUT에 표시하려면 다음을 수행하십시오.
$ awk -v year="$(\date +%Y)" 'BEGIN{FS="/"} {print $0 "," year-$3}' data | tee output-file
bob,wag,06/13/1958,62
ashley,hay,01/23/1983,37
evan,bert,09/11/1972,48
아니면 그냥 같은 파일로 출력하세요:
$ awk -v year="$(\date +%Y)" 'BEGIN{FS="/"} {print $0 "," year-$3}' data > output-file
답변2
gawk
보다 정확한 시간 계산을 수행하려면 's'를 사용할 수 있습니다.시간 및 문자열 함수(@AdminBee의 제안을 기반으로 함) 입력 데이터를 다음과 같이 사용하십시오.
$ cat data
bob,wag,06/13/1958
ashley,hay,01/23/1983
evan,bert,09/11/1972
시차를 알 수 있다하늘지금부터 각 행에 표시된 날짜는 다음과 같습니다.
$ awk -F, 'BEGIN{today=systime()}
{print $0 "," int((today-mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00))/(3600*24))}' \
data | tee output-file
bob,wag,06/13/1958,22755
ashley,hay,01/23/1983,13765
evan,bert,09/11/1972,17551
단편:
int((today-mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00))/(3600*24))
입력 파일의 각 줄에 대해 세 가지 기본 작업이 수행됩니다.
- 윤초는 계산하지 않고 1970-01-01 00:00:00 UTC(POSIX 시스템의 경우) 이후 경과 시간을 초 단위로 계산합니다.
mktime(substr($3,7,4)" "substr($3,1,2)" "substr($3,4,2)" "00" "00" "00)
- 위의 수량과
today
실행 시 1970-01-01 00:00:00 UTC 이후 경과된 초 수를 포함하는 변수 간의 시간 차이를 계산합니다. - 초 단위의 시차를 3600*24로 나누어 동일한 일수를 구하고, 결과의 정수 부분만 고려하여 전체 일수를 구합니다
int()
.
이를 사용하여 요구 사항에 따라 초, 분, 시간 단위의 시차를 얻을 수 있습니다. 화타이
답변3
날짜 차이를 얻으려면 이 작은 bash 기능을 사용할 수 있습니다.
귀하의 필요에 맞게 다음 번호를 사용하십시오
- #얻다하늘가격차이 : 86400
- #얻다년도차이: 31536000
배쉬 기능
datediff() {
current_date=$(date -d "$1" +%s)
birth_date=$(date -d "$2" +%s)
echo $(( (current_date - birth_date) / 31536000)) Years
}
용법:
datediff '9/28/2020' '1/1/1999'
산출:
21 years
답변4
당신이 정말로 원하는 것이 무엇인지에 따라 다릅니다:
연도 차이:
(echo "firstname,lastname,d"; cat input.csv) | csv-sqlite \
"select *, strftime('%Y', 'now') - substr(d, 7, 4) as year_diff
from input" | csv-header --remove
나이:
(echo "firstname,lastname,d"; cat input.csv) | csv-sqlite
"select *, strftime('%Y', 'now') - substr(d, 7, 4) -
case when strftime('%m%d', 'now') >= (substr(d, 1, 2) || substr(d, 4, 2))
then 0 else 1 end as age
from input" | csv-header --remove
csv-sqlite 및 csv-header는 다음에서 왔습니다.csv-nix-도구