使用 AWK 检查一个六列的 txt 文件

Using AWK to check a six column txt file

我是 Awk 的新手,运行遇到了一些问题。我有多个制表符分隔的文本文件,它们由六列组成。栏目布局为:

col1=int 

col2=float

col3=float

col4=int

col5=int

col6=DATE (yyyy-mm-dd) 

手头的任务基本上是对文本文件进行质量检查,以确保每一列都是该类型。我还需要跳过第一行,因为每个制表符分隔的文本文件都有一个 header。到目前为止,这就是我所拥有的:

#!/bin/sh

awk < file1.txt -F\t '
{(NR!=1)}
{if ( != int()||( != /[0-9]+\.[0-9]*/)||( != /[0-9]+\.[0-9]*/)||( != int()||( != int())print "Error At " NR; }
'

我并不是必须要用Awk,只是觉得它最合适而已。

编辑 1:

#!/bin/sh

awk < file1.txt -F\t '
{if (NR!=1){
  if ( != int()) print "Error col1 at " NR;
  else if ( != int()) print "Error col4 at " NR;
  else if ( != int()) print "Error col5 at " NR;
       }
}
'

这似乎工作正常所以我现在的问题是:

1- 如何检查浮点数?

2- 我如何 运行 跨多个文件?

要测试字段是否为数字,您可以检查 if

 + 0 == 

这是有效的,因为如果它不是数字,添加到字符串会将其转换为零。

要运行多个文件的脚本,您可以将它们添加为额外参数,例如

awk 'commands' file1 file2 file3

如果这不是您想要的,请编辑您的问题以包含一些示例输入和预期输出:

awk '
function act_type(n,    t) {
    if (n ~ /^[0-9]{4}(-[0-9]{2}){2}$/) { t = "date"  }
    else if (n ~ /^-?[0-9]+\.[0-9]+$/)  { t = "float" }
    else if (n ~ /^-?[0-9]+$/)          { t = "int"   }
    return t
}
BEGIN { split("int float float int int date",exp_type) }
{
    for (i=1; i<=NF; i++) {
        if (act_type(i) != exp_type[i]) {
            print "Error col", i, "at", NR. "in", FILENAME | "cat>&2"
        }
    }
}
' file

调整正则表达式以适合您的数据(即,如果您的整数可以以 + and/or 开头,则包含 ,s 然后将其包含在正则表达式中)。