参考:实用程序的POSIX标准awk
。
我真正想念的一件事awk
是能够使用定界符将数组连接起来,就像使用join
Perl中的命令一样,通常是为立即输出而完成的。
相反,我最终写了像
for (key in array)
joined_string = (joined_string == "" ? array[key] : joined_string "," array[key])
print joined_string
或者
joined_string = array[1]
for (i = 2; i <= length(array); ++i)
joined_string = joined_string "," array[i];
print joined_string
但是,awk
如果我更改当前字段,可以为我这样做:
OFS="," # (would probably do this in BEGIN)
n = 0
for (key in array)
$(++n) = array[key]
print
我相信这是完全合法的。但是,如果当前输入记录的字段数多于array
数组具有条目的数,则这将在输出中产生垃圾(“垃圾”将是来自输入文件的数据)。因此,很高兴能够做到
OFS = "," # (would probably do this in BEGIN)
n = 0
for (key in array)
$(++n) = array[key]
NF = n
print
我在标准中找不到NF
允许修改的文字,但也没有任何文字表明不允许修改或调用未定义的行为。我能找到的信息就是getline
那套NF
。这并不是说不允许我编写自己的函数或代码块来重设代码NF
,而是在存在getline
“函数”的情况下优先执行此操作。
还声明允许分配给,$0
并且此操作将重置NF
。这是否意味着以下代码会更好?
OFS = "," # (would probably do this in BEGIN)
$0 = ""
n = 0
for (key in array)
$(++n) = array[key]
print
双重问题:
NF
吗?据我所知,尚无标准文本记录set的副作用NF
,甚至是否允许设置。Gawk手册(也作为有效awk
编程出版)说,它尝试一般性地记录Awk,而不是(仅)记录GNU实现,包括以下内容:
递减
NF
会丢弃的值,NF
然后重新计算并重新计算$0
。(直流)
告诫
注意:某些版本的递减时
awk
不会重建。$0
NF
“(dc)”的意思是这是Awk的“黑暗角落”,即,记载不充分(或根本没有记载)并且行为因一种实现而异的行为。
POSIX将特殊变量定义为
由awk设置的变量
但并未指定程序是否可以设置它们(作为一般规则)。某些变量的说明确实提到可以对其进行修改(请参阅ARGC
,ARGV
),另一些变量的更改后果则是由实现定义的(ENVIRON
),还有一些则未提及,只是“明显地”打算由变量进行修改。程序(OFS
等)。
在NF
的情况下,实验给出了部分答案:
NF
工作如GNU Awk中所述,并且mawk
也具有相同的行为;NF
中的一个真实的awk中被保留,但不会导致$0
重新计算。所以我会说
NF
允许设置,但除了设置该值外可能没有任何副作用。$0
是由POSIX指定的,因此根据规格,最后一个变体是正确的。(这是值得商榷无论是在正确的方法,因为它失去了$0
。)在功能方面怎样把数组在awk中的字符串?有趣,但是按照定义,它依赖于GNU Awk扩展,因此不能回答这个问题。
(其他可以设置的变量有点令人惊讶,但是在TOTA中包含NR
和FNR
,FILENAME
但是不能设置,或者设置它会清除其值。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句