我有一个具有以下格式的文本文件:
5 3 1
2 3 4
.....
.....
即空格分隔的 3 列数字/ 但是,某些行可能类似于:
2
3 1
所以,我想检测文本文件是否有任何这样的不一致并打印出来。我该怎么做呢?
答案1
awk 'NF != 3'
这是打印所有不包含三列的行的简单方法。如果您还希望命令在找到任何此类行时返回失败状态:
awk 'NF != 3 {print; ++bad} END {exit(!!bad)}'
删除print;
以不打印任何内容,仅通过退出状态报告此类行的存在。
您还可以使用 grep 执行此操作:
grep -Ev '^[^ ]+ +[^ ]+ +[^ ]+$'
如果您想更严格并打印不恰好由三列组成的所有行,每列都包含一个整数:
grep -Ev '^([0-9]+) +([0-9]+) +([0-9]+)$'
如果您希望允许一个或多个制表符作为列分隔符,请使用制表符[␉ ]+
而不是 +
where 。␉
用于(␉| +)
允许恰好一个制表符或一系列空格。
答案2
如果您真正想要的是问题标题中询问的内容,此awk
命令将打印行号和每行中的字段数:
awk '{print NR,NF}'
答案3
awk '{if(NF != 3) print NR,NF}' file.txt
这将打印文件中没有 3 个字段的行号以及它们具有的字段数。