我必须验证输入文件,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==FNR
和 NR>FNR
。