空文件上的AWK FNR == NR

moo*_*emu 5 bash awk

我正在运行以下命令,只要它们在第一个文件中是内容的,它就会很好用:

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

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

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

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

任何帮助都会得到满足

anu*_*ava 5

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

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

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


Ed *_*ton 5

使用 GNU awk 使用 ARGIND:

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

与其他 awks 的近似值是:

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

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