인쇄 라인에는 특별한 형식과 쉼표 수가 있습니다.

인쇄 라인에는 특별한 형식과 쉼표 수가 있습니다.

내 샘플은 다음과 같습니다.

6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,

ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,

다음 조건으로 행을 인쇄해야 합니다.

  1. 쉼표 수 = 6

  2. 두 번째 필드에는 값이 있어야 합니다(NULL 아님).

  3. 네 번째 필드는 타임스탬프 형식(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>

관련 정보