好吧,所以我做了一些研究,但没有发现任何适合我的问题,并且我是Shell脚本的新手。所以如果我有一个csv文件:
abc,123,456,
abc,123,456,
abc,123,456,
abc,123,456,
我想检查列数是否匹配传入的变量,使用awk并不难。
如果不匹配,请说:
abc,123,456,
abc,
abc,123,456,
abc,123,456,
创建一个日志,指定行,预期内容和实际内容。如果没有不匹配,我遇到的问题是试图跳过记录过程。我需要使其跳过所有匹配的文件,而仅记录那些不匹配的文件,但是我尝试过的所有东西似乎都失败了。在if语句中尝试awks,在if语句中尝试awks,多个awk带有break或exit,这给了我语法错误。我很茫然。任何建议都会有所帮助。
期望的输出非常简单。
文件名
线预期实际
2 3 1
数字之间应该有适当的间距,大声笑
答案 0 :(得分:0)
您应该在awk
中进行日志记录,因此,如果没有要报告的内容,则不会有任何日志记录。
$ awk -F, -v r=3 'BEGIN {header="line expected actual"}
NF!=r {if(!p) print FILENAME "\n" header >> "log.txt";
print NR,r,NF >> "log.txt"; p=1 }' file
在这里,我们将打印头信息的状态保留在变量p
中,因此,如果存在任何不匹配,则仅打印一次。否则,脚本将保持沉默。或者,您可以累积不匹配的行并在END
块中打印。
您也可以通过将文件打印内容移到脚本中来避免创建空的日志文件。