패턴으로 선을 삭제하십시오
문제
안녕하세요 저는 특정 패턴과 일치하는 파일에서 줄을 삭제하고 싶습니다.
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'을 확인하십시오).
이를 고정 시키면 올바른 라인을 삭제해야합니다.