我使用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-如何在多个文件上运行?
答案 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
按下正则表达式以适合您的数据(例如,如果您的整数可以从+
和/或包含,
开始,则将其包含在正则表达式中。