我必须对输入文件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
答案 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==FNR
和NR>FNR
。