使用AWK检查六列txt文件

时间:2015-10-27 14:16:49

标签: bash shell csv awk scripting

我使用Awk是全新的,我遇到了一些问题。我有多个制表符分隔的文本文件,由六列组成。列布局为:

col1=int 

col2=float

col3=float

col4=int

col5=int

col6=DATE (yyyy-mm-dd) 

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

#!/bin/sh

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

我不需要使用Awk,它只是看起来最合适。

编辑1:

#!/bin/sh

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

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

1-如何检查花车?

2-如何在多个文件上运行?

2 个答案:

答案 0 :(得分:1)

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

$1 + 0 == $1

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

要在多个文件上运行脚本,您只需将它们添加为额外参数,例如

awk 'commands' file1 file2 file3

答案 1 :(得分:1)

如果这不是你想要的,那么编辑你的问题以包括一些样本输入和预期输出:

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

按下正则表达式以适合您的数据(例如,如果您的整数可以从+和/或包含,开始,则将其包含在正则表达式中。