날짜 열이 1개월 미만인 파일의 모든 레코드 가져오기

날짜 열이 1개월 미만인 파일의 모든 레코드 가져오기

입력 파일

ID,Name,join_date
21433432,rds,2014_02_01
2131321,ABCDS,2014-10-20
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

두 개의 파일을 생성해야 합니다. 하나는 날짜 열이 1개월 미만, 6개월 미만인 레코드용입니다.

출력 파일 1은 1개월 미만입니다.

ID,name,join_date
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

출력 파일 2가 6개월 미만입니다.

2131321,ABCDS,2014-10-20

명령 을 사용했지만 awk작동하지 않았습니다.

답변1

이는 시작하는 데 도움이 될 것입니다. 시간 함수를 구현하려면 GNU awk가 필요합니다.

gawk -F, '
    function totime(ymd) {gsub(/[-_]/," ",ymd); return mktime(ymd " 0 0 0")}
    BEGIN {now = systime(); m1 = now - 86400 * 30; m6 = now - 86400 * 180}
    FNR == 1 {next}
    {t = totime($3)}
    t > m1 {print "m1", $0; next}
    t > m6 {print "m6", $0}
' file
m6 2131321,ABCDS,2014-10-20
m1 2432745314,ASRER, 2015-01-20
m1 2132432423,safdsad, 2015-12-30

정확히 1개월 6개월은 아니고 30일 180일, 서머타임 전환에 따른 1시간 플러스 마이너스 1시간

답변2

date내부 명령을 사용 하고 awk일부 조건에 따라 출력을 원하는 파일로 리디렉션하기만 하면 됩니다.print

awk -F, 'BEGIN{ "date -d\"month ago\" +%s" | getline T1; close("date"); 
  "date -d\"6 months ago\" +%s" | getline T6; close("date")}
  { "date -d" $3 " +%s" | getline t; close("date"); 
  if(t>T1){print $0>"file2";next} if(t>T6)print $0>"file3"}' file

핵심 부분은 명령을 사용하여 날짜 형식을 1970년 이후의 초로 변환하는 것입니다 date -d ... "+%s". 나머지는 자명해야 합니다.

관련 정보