私のサンプルは次のとおりです。
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,
ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
次の条件で行を印刷する必要があります。
カンマ数 = 6
2番目のフィールドには値が必要です(NULLではありません)。
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>