awk FNR == NR,ORS,OFS混淆

时间:2017-04-05 10:21:35

标签: awk

请帮助我理解该功能背后的逻辑。我很难理解它。

的MyScript:

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

final.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:它表示输出字段分隔符,其默认值为空格。

1 个答案:

答案 0 :(得分:1)

我将从这个

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

在第一个文件处理期间(当前文件记录号等于全局记录号)填充带有值的二维数组。但是,insINS都没有在其他地方定义,所以在这里完成的工作不多......

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

重写可以

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