求助:使用AWK命令筛选CSV中日期格式不符YYYY-MM-DD的记录
需求与问题
需要用AWK命令处理CSV文件,达成以下目标:
- 跳过文件首行
- 识别第11列(日期字段)包含斜线
/的记录(合规格式应为YYYY-MM-DD,禁止出现斜线) - 将这些无效记录输出到指定文件
以下是尝试的两段失效脚本、对应错误信息及测试数据:
尝试的脚本1
awk -F \| '{if(NR > 1) {{$11~/[/]/}}}' $datadir/sys_slate_app_test.csv > "invalid_other.txt"
错误信息
awk: fatal: cannot open file `/sys_slate_app_test.csv' for reading (No such file or directory)
尝试的脚本2
awk -F \| '{if(NR > 1) {{$11~/^//}}}' $datadir/sys_slate_app_test.csv > "invalid_other.txt"
错误信息
awk: cmd. line:1: {if(NR > 1) {{$11~/^//}}}
awk: cmd. line:1: ^ syntax error
测试数据
"30"|"958433018"|"999999999"|"11111111"|"202340"|""|"222222222"|"Tyler"|"Ward"|"email328@yahoo.com"|"2022/08/23"|"UG"|"TR"|"0"|"0"|"0"|"2"|"1"|"RD"|"0"|"1"|"2023-03-09" "30"|"958433018"|"999999999"|"11111111"|"202340"|""|"222222222"|"Tyler"|"Ward"|"email328@yahoo.com"|"2022/09/10"|"UG"|"TR"|"0"|"0"|"0"|"2"|"1"|"RD"|"0"|"1"|"2023-03-09" "30"|"958433018"|"999999999"|"11111111"|"202340"|""|"222222222"|"Tyler"|"Ward"|"email328@yahoo.com"|"2022-08-23"|"UG"|"TR"|"0"|"0"|"0"|"2"|"1"|"RD"|"0"|"1"|"2023-03-09" "30"|"958433018"|"999999999"|"11111111"|"202340"|""|"222222222"|"Tyler"|"Ward"|"email328@yahoo.com"|"2022-06-11"|"UG"|"TR"|"0"|"0"|"0"|"2"|"1"|"RD"|"0"|"1"|"2023-03-09" "30"|"958433018"|"999999999"|"11111111"|"202340"|""|"222222222"|"Tyler"|"Ward"|"email328@yahoo.com"|"2022/08/23"|"UG"|"TR"|"0"|"0"|"0"|"2"|"1"|"RD"|"0"|"1"|"2023-03-09"
解决方案
正确的AWK命令
awk -F '|' 'NR>1 && $11 ~ /\// {print}' "$datadir/sys_slate_app_test.csv" > "invalid_other.txt"
原脚本问题解析
脚本1的错误点:
- 字段分隔符
\|未用引号包裹,shell解析时丢失转义,导致$datadir变量与文件名拼接失败,变成了/sys_slate_app_test.csv,无法找到文件。 - 仅做了匹配判断,缺少
print语句,即使匹配成功也不会输出内容。 - 多余的双层大括号
{{}}属于无效语法,AWK不需要嵌套大括号。
- 字段分隔符
脚本2的错误点:
- 正则表达式写法错误:
/^//中斜线未转义,正确写法应为/\//;且^表示行首,此处不需要,只需判断字段包含斜线即可。 - 同样缺少
print语句,且存在多余的嵌套大括号。
- 正则表达式写法错误:
命令说明
-F '|':用单引号包裹分隔符,避免shell解析转义字符,正确设置字段分隔符为竖线。NR>1:跳过首行(NR代表记录号,即行号)。$11 ~ /\//:判断第11个字段包含斜线/。{print}:当条件满足时,输出当前整行记录。
内容的提问来源于stack exchange,提问作者KimH
相关产品推荐
相关产品推荐

