为什么awk的打印无法重定向



我需要将配置文件1合并到配置文件2。若文件1有文件2并没有,则将其附加到文件2的末尾。我可以用系统替换打印来修复错误,但我不知道为什么打印不起作用。

使用print i"=" a[i] >> ARGV[2];,无法将文本附加到文本的末尾

1.txt,注意第三行是一个空行:

key=5678
abc=000
  1. txt:
key=1234

测试工作:

#!/usr/bin/env -S gawk -F= -f
{
key = gensub(/s/, "", "g", $1);
if (NR==FNR) {
a[key]=$2;
} else {
b[key]=$2;
}
}
END{
for (i in a) {
if (b[i] == "") {
print "bi = empty, append to end of file:" i"="a[i];
print i"="a[i] >> ARGV[2];
# system("echo " i "=" a[i] ">>" ARGV[2]);
} else if (a[i] != b[i]) {
cmd = sprintf("sed -i -r 's@\s*(%s)\s*=.*@\1=%s@' %s", i, a[i], ARGV[2]);
system(cmd);
}
}
}

跑步/test.awk 1.txt结果:

$ ./test.awk 1.txt 2.txt 
bi = empty, append to end of file:=
bi = empty, append to end of file:abc=000
$ cat 2.txt 
key=5678
=

为什么abc=000没有添加到2.txt中?如果它被更改为系统("echo"I&"="a[I]&">"argv[2](,并且它再次正常,那么打印中是否存在错误?

在gnu-awk手册中;5.9关闭输入和输出重定向";,需要调用关闭函数,当多个命令在同一个文件上操作时,例如pipe或cmd太糟糕了,所以我放弃打印>gt;,仅使用system((。

最后,我使用这个脚本:

#!/usr/bin/env -S gawk -F"=|is" -f
# File:   sync_kernelconfig.awk
# Author: Edward.Tang
# Mail:   edaplayer@163.com
# Function: 同步文件1的内核配置到文件2
function set_value(array, comment, k, v)
{
if (!/^s*#/) {
array[k]=v;
} else {
comment[k]=$2;
}
}
{
key = gensub(/#|s/, "", "g", $1);
if (key == "") next; # 跳过空行
if (NR==FNR) {
set_value(a1, c1, key, $2);
} else {
set_value(a2, c2, key, $2);
line[key] = $0; # line data of file2
}
}
END {
for (i in a1) {
if (a2[i] == "") {
if (c2[i] == "") {
system("echo " i "=" a1[i] ">>" ARGV[2]);
} else {
cmd = sprintf("sed -i -r 's~%s~%s=%s~' %s", line[i], i, a1[i], ARGV[2]);
system(cmd);
}
} else if (a1[i] != a2[i]) {
cmd = sprintf("sed -i -r 's~%s~%s=%s~' %s", line[i], i, a1[i], ARGV[2]);
system(cmd);
}
}
for (i in c1) {
if (a2[i] != "") {
cmd = sprintf("sed -i -r 's~%s~# %s is%s~' %s", line[i], i, c1[i], ARGV[2]);
system(cmd);
}
}
}

在gnu awk手册中;5.9关闭输入和输出重定向";,需要调用close函数,当多个命令在同一个文件上操作时,例如pipe或cmd,这太糟糕了。

所以我需要使用:

print i"="a[i] >> ARGV[2];
close(ARGV[2]);

或:

system("echo " i "=" a1[i] ">>" ARGV[2]);

相关内容

  • 没有找到相关文章

最新更新