打印时改写自身的 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
条件,
这是我的第一个问题,如果有什么遗漏请告诉我。
这是一个使用数组生成 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
条件,