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 包含目前看到的 NR 条记录。通常,一条记录是一行——尽管您可以更改记录分隔符——所以这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,它的值将从 1 到 14 运行。

变量FNR (File NR记录数) 的工作方式相同,但在每个新文件的开头重置为 1。所以在这种情况下,它的值将从 1 到 4,然后是 1 到 10 运行。

通过比较这两个值,程序可以确定当前正在处理哪个文件。如果 NRFNR 相同,我们知道我们在第一个文件中,并使用该行的内容填充关联数组 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