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

时间:2018-12-26 03:04:06

标签: awk

我必须对输入文件Input.txt,进行验证,以确保每行上的字段分隔符的数目正确,并且即使包括标题的一行甚至缺少或超过字段分隔符的正确数目,也要打印文件的名称到errorfiles.txt并退出。

我还有一个文件可以用作正确数量的字段分隔符valid.txt的参考,然后将输入文件每一行上的字段分隔符的数量与{{1 }}文件。

valid.txt

这不起作用。

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

2 个答案:

答案 0 :(得分:3)

不是完全清楚您的要求,仅在提供的单个输入文件上打印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指向的文件相关联的文件描述符,而不是让操作系统执行。

答案 1 :(得分:0)

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