使用 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 然后将其包含在正则表达式中)。
我是 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 然后将其包含在正则表达式中)。