打印行有特殊的格式和逗号数量

打印行有特殊的格式和逗号数量

这是我的样本:

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>

相关内容