空文件上的AWK FNR == NR

时间:2016-05-03 19:14:40

标签: bash awk

我正在运行以下命令,只要它们在第一个文件中有内容就可以运行:

awk -F, 'FNR==NR {a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv

如果第一个文件为空,则该命令不起作用。我在网上找到了这个参考文献:

  

使用双文件成语的所有程序都无法正常工作   如果第一个文件为空(在这种情况下,awk将执行操作   在读取第二个文件时与NR == FNR相关联)。要纠正这个,   您可以通过添加检查测试来强化NR == FNR条件   FILENAME也等于ARGV [1]。

我不确定我理解查询中添加测试检查的方式(或在哪里)等于ARGV [1]

任何帮助都会得到解决

2 个答案:

答案 0 :(得分:5)

您可以使用以下附加条件:

awk -F, 'ARGV[1] == FILENAME{a[tolower($1)]++; next} !a[tolower($1)]' OutSideSyncUsers.csv NewUsers.csv

附加条件ARGV[1]==FILENAME确保第一个块仅对参数列表中的第一个文件执行。当第一个文件为空时,它将跳过第一个块。这样,您可以确保第二个块!a[tolower($1)]始终在参数列表中的第二个文件上执行。

答案 1 :(得分:4)

使用GNU awk使用ARGIND:

awk -F, '{k=tolower($1)} ARGIND==1{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv

与其他awks的近似值是:

awk -F, '{k=tolower($1)} FILENAME==ARGV[1]{a[k]; next} !(k in a)' OutSideSyncUsers.csv NewUsers.csv

但是如果/当您解析同一个文件两次时,它会失败。