印刷行には特別な形式とカンマ数があります。

印刷行には特別な形式とカンマ数があります。

私のサンプルは次のとおりです。

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

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

次の条件で行を印刷する必要があります。

  1. カンマ数 = 6

  2. 2番目のフィールドには値が必要です(NULLではありません)。

  3. 4番目のフィールドはタイムスタンプ形式(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>

関連情報