a[FNR]=a[FNR]的含义是什么&引用$0:$0 awk?

a[FNR]=a[FNR]的含义是什么&引用$0:$0 awk?,awk,Awk,我知道那是什么?是为类似 (condition) ? statement-1: statement-2 但是,在这种情况下,我不理解a[FNR]=a[FNR]是如何工作的,这是什么时候的错误 awk '{a[FNR]=a[FNR] ? a[FNR]","$0 : $0} END{for(i=1;i<=FNR;i++)print a[i]}' *.csv awk'{a[FNR]=a[FNR]?a[FNR],“$0:$0}END{for(i=1;ia[FNR]=a[FN

我知道那是什么?是为类似

(condition) ? statement-1: statement-2
但是,在这种情况下,我不理解a[FNR]=a[FNR]是如何工作的,这是什么时候的错误

awk '{a[FNR]=a[FNR] ? a[FNR]","$0 : $0} END{for(i=1;i<=FNR;i++)print a[i]}' *.csv
awk'{a[FNR]=a[FNR]?a[FNR],“$0:$0}END{for(i=1;i
a[FNR]=a[FNR]?a[FNR],”,“$0:$0
这里的
是一个三元运算符。其中的条件就是
a[FNR]
。其中
a
是一个关联数组

这意味着如果
a[FNR]
不为空且非零,则设置
a[FNR]=a[FNR],“$0
表达式,否则设置
a[FNR]=0

换句话说,它相当于:

if(a[FNR]){
a[FNR]=a[FNR],“$0
}否则{
a[FNR]=0美元
}

正确的方法是这样使用,正如教育署在评论中正确建议的那样:

a[FNR]=(a中的FNR?a[FNR],“:”)$0

以下详细解释可能对您有所帮助。这仅用于解释目的

awk '                                   ##Starting awk program from here.
{
  a[FNR]=a[FNR] ? a[FNR]","$0 : $0      ##Creating an array named a with index of current line number FNR.
                                        ##It is keep concatenating same line number index array value to itself to get all same line number values in a single array item.
}
END{                                    ##Starting END block of this program from here.
  for(i=1;i<=FNR;i++){                  ##Running for loop till value of FNR here.
    print a[i]                          ##Printing array a value with index of variable i here.
  }
}' *.csv                                ##Passing all csv files here.
awk'##从这里启动awk程序。
{
a[FNR]=a[FNR]?a[FNR],“$0:$0 35;#创建一个名为a的数组,其索引为当前行号FNR。
##它不断将相同的行号索引数组值连接到自身,以在单个数组项中获得所有相同的行号值。
}
结束{##从此处开始此程序的结束块。

对于(i=1;i而言,与应用时相比,条件运算符中缺少的括号肯定会混淆很多:

$ awk '
BEGIN {
    a="a"                 # some values for a and b
    b="b"
    a=(a ? a "," b : b)   # properly parenthesized ternary operator
    print a
}'
针对样本中
a
(或
a[FNR]
的不同值的一些测试用例,需要考虑:

$ awk 'BEGIN{a="a";b="b";a=a?a","b:b;print a}'
a,b
$ awk 'BEGIN{a="";b="b";a=a?a","b:b;print a}'
b
$ awk 'BEGIN{a="0";b="b";a=a?a","b:b;print a}'
0,b
$ awk 'BEGIN{a=0;b="b";a=a?a","b:b;print a}'
b
基本上,
a
a
非空且数值不为零时,会附加一个逗号和
b
的值

另外,您可能应该监视逗号控件的
b
值(作为练习),谁想要输出:

a,

相关文件,以了解

a[FNR]=a[FNR] ? a[FNR]","$0 : $0
哪个运算符具有更高的优先级,从而允许回答where
可以在不更改逻辑的情况下进行放置。在您的示例中,有赋值、连续和三值。字符串连续在所有枚举中具有最高的优先级,三值是中间的,赋值是最低的,因此应用后:

a[FNR]=(a[FNR] ? (a[FNR]","$0) : $0)
文档提示代码编写者使用
以避免可能的混淆

每当出现异常情况时,总是使用括号是明智的 操作员的组合,因为其他阅读程序的人 可能不记得在这种情况下的优先顺序。即使是经验丰富的 程序员偶尔会忘记确切的规则,这会导致 错误。明确的括号有助于防止任何此类错误


注意,提供运算符优先级的需要不限于
AWK
语言,而是使用中缀符号的所有语言,即大多数常用编程语言(使用反向波兰符号的语言,例如
FORTH
,不受此要求的影响).

我理解关于三元运算符的部分。a[FNR]=a[FNR]有点像一个特殊条件吗?你说它只是a[FNR]不是空的和非零的。这是我不理解的部分。是的,
a[FNR]=…
只是一个赋值,条件就是
a[FNR]
a[FNR]时返回true
不为空且不为零。非常好。