Gawk:使用来自另一个文件的查找数据插入行
Gawk: Insert line using lookup data from another file
我正在尝试将行插入文件,其中插入的数据基于存储在另一个文件中的数据。我在 Sed 和 Awk 中都试过了,但都不知道如何访问第二个文件。这对 Sed 来说可能是一个延伸,对 Awk 来说可能不那么延伸?
主文件:
# alpha --
some data
some more data
# beta --
some data
some more data
# gamma --
some data
some more data
查找文件:
alpha This is a description of alpha
gamma This guys description
delta And a third description
结果应如下所示:
# alpha --
Description = This is a description of alpha
some data
some more data
# beta --
some data
some more data
# gamma --
Description = This guys description
some data
some more data
请注意查找文件可能没有项目的描述,这没关系; "Description = " 行将被省略。
我在 Awk 中想出了这么多,但不知道如何引用查找文件:
awk '{
if ([=13=] ~ /^# [^ ]* --/) {
print [=13=];
print "Description = "; # How to lookup 's description??
} else {
print [=13=];
}
}' <file1.txt
如何使用 Awk 从第二个文件中获取描述?或者有更好的工具吗?谢谢!
您可以这样做,按逻辑顺序在 awk
命令行上提供两个文件(首先是描述,以便它可以读取和存储它们,然后是需要插入的数据):
$ awk '(NR == FNR) {
desc[]=;
for (i=3;i<=NF;i++) {
desc[]=desc[]" "$i
};
}
(NR > FNR) {
print;
if (/^#/) {
print "Description = "desc[];
}
}' desc.txt main.txt
根据您的示例文件内容生成此输出:
# alpha --
Description = This is a description of alpha
some data
some more data
# beta --
Description =
some data
some more data
# gamma --
Description = This guys description
some data
some more data
解释:
awk 变量 NR
包含目前看到的 N 条 R 条记录。通常,一条记录是一行——尽管您可以更改记录分隔符——所以这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,它的值将从 1 到 14 运行。
变量FNR
(File NR记录数) 的工作方式相同,但在每个新文件的开头重置为 1。所以在这种情况下,它的值将从 1 到 4,然后是 1 到 10 运行。
通过比较这两个值,程序可以确定当前正在处理哪个文件。如果 NR
和 FNR
相同,我们知道我们在第一个文件中,并使用该行的内容填充关联数组 desc
。第一个字段(</code>)是键;我们将其余字段连接在一起以形成值。 </p>
<p>如果 <code>NR
不 等于 FNR
(它只能更大,不能更小),我们知道我们在第二个文件中.在那种情况下,我们首先打印该行(我们总是这样做,所以我们只是让它成为无条件的而不是重复该语句)。然后我们检查是否需要附加描述。如果我们这样做,请在 desc
数组中查找 - 使用
(该行的第二个 whitespace-separated 字段,第一个是“#”)作为查找键。
另一个相似的awk
$ awk 'NR==FNR {k=; sub(/^\S+\s+/,"Description = "); dict[k]=[=10=]; next}
1;
/^#/ {if( in dict) print dict[]}' dict file
我正在尝试将行插入文件,其中插入的数据基于存储在另一个文件中的数据。我在 Sed 和 Awk 中都试过了,但都不知道如何访问第二个文件。这对 Sed 来说可能是一个延伸,对 Awk 来说可能不那么延伸?
主文件:
# alpha --
some data
some more data
# beta --
some data
some more data
# gamma --
some data
some more data
查找文件:
alpha This is a description of alpha
gamma This guys description
delta And a third description
结果应如下所示:
# alpha --
Description = This is a description of alpha
some data
some more data
# beta --
some data
some more data
# gamma --
Description = This guys description
some data
some more data
请注意查找文件可能没有项目的描述,这没关系; "Description = " 行将被省略。
我在 Awk 中想出了这么多,但不知道如何引用查找文件:
awk '{
if ([=13=] ~ /^# [^ ]* --/) {
print [=13=];
print "Description = "; # How to lookup 's description??
} else {
print [=13=];
}
}' <file1.txt
如何使用 Awk 从第二个文件中获取描述?或者有更好的工具吗?谢谢!
您可以这样做,按逻辑顺序在 awk
命令行上提供两个文件(首先是描述,以便它可以读取和存储它们,然后是需要插入的数据):
$ awk '(NR == FNR) {
desc[]=;
for (i=3;i<=NF;i++) {
desc[]=desc[]" "$i
};
}
(NR > FNR) {
print;
if (/^#/) {
print "Description = "desc[];
}
}' desc.txt main.txt
根据您的示例文件内容生成此输出:
# alpha --
Description = This is a description of alpha
some data
some more data
# beta --
Description =
some data
some more data
# gamma --
Description = This guys description
some data
some more data
解释:
awk 变量 NR
包含目前看到的 N 条 R 条记录。通常,一条记录是一行——尽管您可以更改记录分隔符——所以这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,它的值将从 1 到 14 运行。
变量FNR
(File NR记录数) 的工作方式相同,但在每个新文件的开头重置为 1。所以在这种情况下,它的值将从 1 到 4,然后是 1 到 10 运行。
通过比较这两个值,程序可以确定当前正在处理哪个文件。如果 NR
和 FNR
相同,我们知道我们在第一个文件中,并使用该行的内容填充关联数组 desc
。第一个字段(</code>)是键;我们将其余字段连接在一起以形成值。 </p>
<p>如果 <code>NR
不 等于 FNR
(它只能更大,不能更小),我们知道我们在第二个文件中.在那种情况下,我们首先打印该行(我们总是这样做,所以我们只是让它成为无条件的而不是重复该语句)。然后我们检查是否需要附加描述。如果我们这样做,请在 desc
数组中查找 - 使用 (该行的第二个 whitespace-separated 字段,第一个是“#”)作为查找键。
另一个相似的awk
$ awk 'NR==FNR {k=; sub(/^\S+\s+/,"Description = "); dict[k]=[=10=]; next}
1;
/^#/ {if( in dict) print dict[]}' dict file