문제

안녕하세요 저는 특정 패턴과 일치하는 파일에서 줄을 삭제하고 싶습니다.

BEGIN {
       FS = "!";
       stopDate = "date +%Y%m%d%H%M%S";
       deletedLineCtr = 0;   #diagnostics counter, unused at this time
      }
      {
     if( $7 < stopDate )
          {
           deletedLineCtr++;
          }
      else
           print $0
      }

코드는 파일에 줄이 있다고 말합니다. "!" 분리 된 7 번째 필드는 날짜 yyyymmddhhmmss 형식입니다. 스크립트는 날짜가 시스템 날짜보다 작은 줄을 삭제합니다. 그러나 이것은 작동하지 않습니다. 아무도 나에게 이유를 말할 수 있습니까?

도움이 되었습니까?

해결책

AWK (1) 과제는 화요일에 마감됩니까? 정말 아, ?? :-)

좋아, 나는 당신이 무엇인지 정확히 확신하지 못했기 때문에 약간의 추측을했습니다. 이 AWK 프로그램은 현재 시간을 얻은 다음 파일의 모든 줄을 그보다 적게 제거합니다. 나는 하나의 디버그 인쇄를 남겼습니다.

BEGIN {
  FS = "!"
  stopDate = strftime("%Y%m%d%H%M%S")
  print "now: ", stopDate
}
{ if ($7 >= stopDate) print $0 }

$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now:  20090914234342
!!!!!!20100914233848
$ 

다른 팁

전화 date 먼저 포맷 된 날짜를 매개 변수로 전달합니다.

awk -F'!' -v stopdate=$( date +%Y%m%d%H%M%S ) '
    $7 < stopdate { deletedLineCtr++; next }
    {print}
    END {do something with deletedLineCrt...}
'

날짜를 stopdate로 가져 오려면 날짜 명령 (백 티크)을 실행해야 할 것입니다. 작성된 코드로 stopdate를 인쇄 한 경우, 숫자 문자열이 아닌 "날짜 +..."가 포함됩니다. 그것이 당신의 문제의 근본 원인입니다.

안타깝게도...

백틱이 어떤 버전의 AWK (Old Awk, New Awk, GNU awk)에서 작동한다는 증거를 찾을 수 없습니다. 따라서 코드를 Perl로 마이그레이션해야합니다 (Perl은 원래 'awk -killer'로 설계되었지만 여전히 a2p AWK 스크립트를 Perl로 변환하려면) 또는 날짜 설정 방법을 재고해야합니다.

@DigitalRoss의 답변을보고 strftime() 기능 gawk 원하는 서식을 제공합니다 (내가 한 것처럼 '정보 gawk'을 확인하십시오).

이를 고정 시키면 올바른 라인을 삭제해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top