对输入文件的每一行上的字段分隔符进行计数,如果缺少/超过,则将文件名输出到错误文件



我必须验证输入文件,Input.txt,每行上是否有正确数量的字段分隔符,如果包括标题在内的一行丢失或超过正确的字段分隔符数量,则打印文件名以errorfiles.txt并退出。

我有另一个文件用作正确数量的字段分隔符的参考,valid.txt,然后将输入文件每行上的字段分隔符数量与valid.txt文件中的字段分隔符数量进行比较。

awk -F '|' '{ print NF-1; exit }' valid.txt > fscount    
awk -F '|' '(NF-1) != "cat fscount" { print FILENAME>"errorfiles.txt"; exit}' Input.txt

这是行不通的。

awk -F '|' '{ print NF-1; exit }' valid.txt > fscount
awk -F '|' '(NF-1) != "cat fscount" { print FILENAME>"errorfiles.txt"; exit}' Input.txt

目前还不完全清楚您的要求是什么,要在提供的单个输入文件上打印FILENAME,也许您想循环运行此命令的目录上的文件列表?

无论如何,要在awk上下文中使用文件的内容,只需使用其-v开关并在文件上使用输入重定向即可

awk -F '|' -v count="$(<fscount)" -v fname="errorfiles.txt" '(NF-1) != (count+0) { print FILENAME > fname; close(fname); exit}' Input.txt

请注意此处使用 close(filename),这通常是在构造awk内操作文件时必需的。close()调用只是关闭与显式打开filename指向的文件关联的文件描述符,而不是让操作系统执行此操作。

GNU awk 解决方案:

awk -F '|' 'ARGIND==1{aimNF=NF; nextfile} ARGIND==2{if (NF!=aimNF) {print FILENAME > "errorfiles.txt"; exit}}' valid.txt Input.txt

您只需一个命令即可完成,
-- 使用awk读取两个文件,存储第一个文件的NF号,并在第二个文件中进行比较。

对于其他awk,您可以将ARGIND==1替换为FILENAME==ARGV[1],依此类推。
或者,如果您确定第一个文件不会为空,请改用 NR==FNRNR>FNR

最新更新