내 샘플은 다음과 같습니다.
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,
ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
다음 조건으로 행을 인쇄해야 합니다.
쉼표 수 = 6
두 번째 필드에는 값이 있어야 합니다(NULL 아님).
네 번째 필드는 타임스탬프 형식(YYYY-MM-DD HH:MI:SS)이어야 합니다.
이 경우에는 "AWK"를 사용해야 합니다.
답변1
그냥 사용하는 것이 더 낫습니다 grep
. 이와 같은 정규 표현식이 어려워 보일 수도 있지만 한발 물러서면 더 좋아질 것입니다.
__=[^,]* d=[0-9][0-9] y=$d$d m=$d
grep "^$__,${__%?}$__,$__,$y-$m-$d $d:$d:$d,$__,$__,$__$\
" <<\IN
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,
ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
IN
바라보다? 그다지 나쁘지는 않습니다. 심지어 약간의 진실도 있습니다. BRE 이건 뭔가요(기본 정규 표현식)장점: 더 높은 수준의 추상화에 쉽게 도달합니다.
위 내용을 인쇄하세요.
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
답변2
awk와 grep의 조합을 사용해도 괜찮다면.
awk -F"," ' {
if ( $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file> | grep '.*,.*,.*,.*,.*,.*,.*'
편집 : 순수한 awk 대체품입니다. 이 점을 지적해 주신 @Archemar에게 감사드립니다.
awk -F"," ' {
if ( NF == 7 && $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file>