awk FNR==NR, ORS, OFS confused



请帮助我理解函数背后的逻辑。我有点困惑地理解它。

我的脚本:

generate_exception(){
    awk -F "," 'FNR==NR{a[ins,INS]=ins "," INS;next}{ if (!a[ins,INS]) print $0,"is not available"}' OFS="," my_$1_lookup.csv final.csv >> exception.csv
}
generate_exception ins INS

my_ins_lookup.csv

STANDARD & POORS,XS00001,ISS ILN,SG CORP
STANDARD & POORS,XS00002,ISS ILN,SG CORP
STANDARD & POORS,XS00003,PM,US CORP
STANDARD & POORS,XS00004,LMT,US CORP
STANDARD & POORS,XS00005,NAT,FR CORP

决赛.csv

MOODYS,USEQ27,N.A.
STANDARD & POORS,XS00001,N.A.
MOODYS,SGD,NR
STANDARD & POORS,XS00004,N.A.

以下是我的理解:

FS:字段分隔符(默认空格(

NF:当前记录中的字段数

NR:当前记录数

NR:表示当前记录的编号。例如,以下示例在当前记录包含的字段少于三个时打印记录。

FNR:它类似于NR,但相对于当前文件。它在以下情况下很有用AWK 正在处理多个文件。FNR 的值使用新文件重置。

ORS:它表示输出记录分隔符,其默认值为换行符。

OFS:它表示输出字段分隔符,其默认值为空格。

我将从这个开始

awk -F "," 'FNR==NR{a[ins,INS]=ins "," INS; next}...

在第一次文件处理期间(当前文件记录数等于全局记录数(,用值填充二维数组。 但是,insINS 都没有在其他任何地方定义,所以这里无法完成太多工作......

我的猜测是,您必须根据输入文件将ins替换为$1INS替换为$2

重写可以是

awk -F, 'FNR==NR        {a[$1,$2]; next} 
        !(($1,$2) in a) {print $0, "is not available"}' file1 file2

最新更新