【问题标题】:awk FNR==NR, ORS, OFS confusedawk FNR==NR,ORS,OFS 混淆
【发布时间】:2017-04-06 16:33:30
【问题描述】:

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

我的脚本:

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

【问题讨论】:

  • 您想知道代码如何工作/不工作/?
  • 首先,我想了解一下代码背后的逻辑。其次,它是工作还是不工作。
  • 您会感到困惑是可以理解的,因为脚本中有很多没有意义的地方。我们可能会猜到正在尝试什么,但我建议您使用预期的输出完成您的问题,让我们帮助您从头开始重写函数。不用担心,我们将解释解决方案的每个部分。
  • 就目前而言,显示的脚本永远不会产生显示的输出。主要原因由下面的 karakfa 解释。我想你错过了一些信息。请显示正确的脚本,以便我们提供帮助。另外,您对 NR 和 FNR 的理解是错误的,但是一旦显示正确的脚本就可以解决。
  • wrt is it working or not working - 你为什么要问?执行代码。它奏效了吗?获取 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,了解 awk。

标签: awk


【解决方案1】:

我会从这个开始

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

【讨论】:

  • 它把逗号加在一起,有多少行就有多少。变量名称绝对是奇怪的(为什么只有一个值时是一个数组?等等)但它确实有一些东西。
  • 我说完成,如果你按照脚本进行查找,显然附加逗号不是预期的操作。
猜你喜欢
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2016-05-21
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多