Bash 스크립트/awk 입력 및 출력 CSV 파일

Bash 스크립트/awk 입력 및 출력 CSV 파일

쉼표로 구분된 세 개의 열(이름, 성, 생년월일)로 구성된 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-도구

관련 정보