打印时改写自身的 awk 数组

awk array that overtypes itself when printed

这是我的第一个问题,如果有什么遗漏请告诉我。

这是一个使用数组生成 key-value 对的 awk 脚本。

我有一个文件,其中包含 header 信息,用冒号分隔。数据在它下面,也用冒号分隔。我的目标是制作 key-value 对打印到一个新文件。我已将所有内容设置为放置在数组中,它完美地打印出 almost

这里是输入:

...:iscsi_name:iscsi_alias:panel_name:enclosure_id:canister_id:enclosure_serial_number
...:iqn.1111-00.com.abc:2222.blah01.blah01node00::11BLAH00:::

代码如下:

#!/bin/awk -f
BEGIN {
    FS = ":"
}
{
    x = 1
    if (NR==1) {
        num_fields = NF ###This is done incase there are uneven head fields to data fields###
        while (x <= num_fields) {
            head[x] = $x
            x++
        }
    }
    y = 2
    while (y <= NR) {
        if (NR==y) {
            x = 1
            while (x <= num_fields) {
                data[x] = $x
                x++
            }
            x = 1
            while (x <= num_fields) {
                print head[x]"="data[x]
                x++
            }
        }
        y++
    }
}
END {
    print "This is the end of the arrays and the beginning of the test"
    print head[16]
    print "I am head[16]-"head[16]"- and now I'm going to overwrite everything"
    print "I am data[16]-"data[16]"- and I will not overwrite everything, also there isn't any data in data[16]"
}

这是输出:

...
iscsi_name=iqn.1111-00.com.abc
iscsi_alias=2222.blah01.blah01node00
panel_name=
enclosure_id=11BLAH00
canister_id=
=nclosure_serial_number ### Here is my issue ###
This is the end of the arrays and the beginning of the test
enclosure_serial_number
- and now I'm going to overwrite everything
I am data[16]-- and I will not overwrite everything, also there isn't any data in data[16]

注意:数据[16]不在一行的末尾,出于某种原因,数据行上有一个额外的冒号,因此上面的num_fields注释

为什么head[16]会覆盖自己?是不是字段末尾有一个换行符(\n)?如果是这样,我该如何摆脱它?我试过加减最后一个字符,没有运气。我试图限制数组在该字段上可以容纳的字符数,但没有成功。我尝试了更多的想法,但没有运气。 完全披露:我对所有这一切都比较陌生,我可能搞砸了这些以前的修复!

有人知道为什么会这样吗? 谢谢! -cheezter88

您的脚本不必要地复杂。如果要调整第一行的记录大小,请这样做。

(我用 "x" 替换了“...”前缀)

awk -F: 'NR==1 {n=split([=10=],h); next}   # populate header fields and record size
         NR==2 {for(i=1;i<=n;i++)      # do the assignment up to header size
                  print h[i]"="$i}' file

x=x
iscsi_name=iqn.1111-00.com.abc
iscsi_alias=2222.blah01.blah01node00
panel_name=
enclosure_id=11BLAH00
canister_id=
enclosure_serial_number=

如果要对其余记录执行此操作,请删除 NR==2 条件,