UNIX下如何查找管道分隔文件中列数异常的记录及对应行号
解决方案
核心问题说明
你原有命令存在两个问题:
- 分隔符配置错误:你用了
-F\;指定分号为分隔符,实际文件是管道符|分隔,需要调整分隔符配置 - 没有调用awk内置行号变量
NR,因此无法定位到具体异常行
操作步骤
场景1:已知预期列数
比如示例中预期列数为3,直接执行以下命令即可输出所有异常行的行号和内容:
awk -F'|' 'NF != 3 {print "行号:" NR, "内容:" $0}' NPS.txt
示例运行结果:
行号:4 内容:4|d|40|old
场景2:未知预期列数
先统计各列数的出现频次,确定正常列数(通常出现次数最多的就是正常列数):
awk -F'|' '{print NF}' NPS.txt | sort | uniq -c
示例运行结果:
3 3 1 4
可以看出列数为3的记录有3条,列数为4的记录有1条,确定正常列数为3后,再执行场景1的命令定位异常行即可。
进阶:一步完成统计+定位
如果你想一次性看到所有列数对应的出现次数和关联行号,可以直接执行以下命令:
awk -F'|' '{ cnt[NF]++ line[NF] = line[NF] NR " " } END { for (n in cnt) { print "列数" n ":出现次数" cnt[n] ",对应行号:" line[n] } }' NPS.txt
示例运行结果:
列数3:出现次数3,对应行号:1 2 3 列数4:出现次数1,对应行号:4
内容的提问来源于stack exchange,提问作者Federico López
相关产品推荐
相关产品推荐

