目的是检查输入文件的每一列是否包含完全相同的数字。与参考文件相比。
这是我发现检查文件格式是否具有完全相同的结构(按列进行相同挖掘)的方法
ref_file
1111 2222 333 4
文件
1266 2233 344 1
1122 3333 444 1
1111 2222 222 1
1112 2220 22 1
1111 2222 222
1111 2222 222 1
我尝试的代码。
dd=`awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' ref_file | awk '{ for(i=1; i<=NF;i++) j+=$i; print j; j=0 }'`
awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' file |
awk '{ for(i=1; i<=NF;i++) j+=$i; print $0" " j; j=0 }' |
awk '{if($NF!~'$dd')print $0 " error"}' | wc -l | awk '{if($1>0) print "FILE FORMAT WRONG "}'
我相信有一种简单的方法。
使用我的代码。我对每一列的挖掘计数并对每一行求和,如果任何行的总数与总挖掘不匹配,则输入文件有错误。 IE,第4行和第5行。没有必要打印错误行。仅当至少一行与参考文件的结构不同时。show msg“文件格式错误”之类的。
预先感谢
答案 0 :(得分:2)
这是我想出的(据我了解的问题):
awk 'NR==1{fields=NF
for (i = 1; i <= fields; i++)
cols[i]=length($i)
}
NR>1 { if(NF != fields)
print "line "NR" has a different number of columns"
else
for (i = 1; i <= NF; i++)
if(length($i) != cols[i])
print "column "i" in line "NR" has a different length"
}' t
输出:
column 3 in line 4 has a different length
line 5 has a different number of columns
答案 1 :(得分:2)
类似于F. Knorr的回答,但使用ref_file
awk '
NR == FNR { nf = NF; for (i=1; i<=NF; i++) len[i] = length($i); next }
NF != nf { err = FNR; exit }
{ for (i=1; i<=NF; i++) if (len[i] != length($i)) { err = FNR; exit } }
END { if (err) { print "invalid file format on line", err; exit 1 } }
' ref_file file
您的注释几乎是 :FILENAME是有效的awk变量,其中包含 current 文件的名称(取自给定的命令参数,或“- “如果awk正在从标准输入中读取)
END {
if (err) {print "invalid file format on line", err; exit 1}
print "File format correct for :", FILENAME
}
答案 2 :(得分:1)
尝试一下:
awk 'NR == FNR {
for (i=1; i<=NF; ++i) {
a[i]=length($i)
}
next
}
{
for (i=1; i<=NF; ++i) {
if (length($i)!=a[i]) {
printf("error at line %d, column %d.\n%s\n", FNR, i, $0)
exit
}
}
}' ref_file file
输出:
error at line 4, column 3.
1112 2220 22 1