Gawk:使用来自另一个文件的查找数据插入行

时间:2017-02-01 00:28:58

标签: awk sed gawk

我试图将行插入文件,其中插入的数据基于存储在另一个文件中的数据。我已经在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

请注意,查找文件可能没有该项目的描述,而且可以; "描述="行将被省略。

我在Awk中想了很多,但不知道如何引用查找文件:

awk '{
    if ($0 ~ /^# [^ ]* --/) {
        print $0;
        print "Description = ";   # How to lookup $2's description??
    } else {
        print $0;
    }
}' <file1.txt

如何使用Awk从第二个文件中获取说明?或者有更好的工具吗?谢谢!

2 个答案:

答案 0 :(得分:4)

另一个类似的awk

$ awk 'NR==FNR {k=$1; sub(/^\S+\s+/,"Description = "); dict[k]=$0; next} 
               1; 
       /^#/    {if($2 in dict) print dict[$2]}' dict file

答案 1 :(得分:2)

您可以执行类似的操作,以逻辑顺序在awk命令行上提供这两个文件(首先是描述,因此它可以读取和存储它们,然后是需要插入的数据):

$ awk '(NR == FNR) { 
    desc[$1]=$2; 
    for (i=3;i<=NF;i++) {
      desc[$1]=desc[$1]" "$i 
    }; 
  }  
  (NR > FNR) { 
    print; 
    if (/^#/) { 
      print "Description = "desc[$2]; 
    }  
  }' 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 F ile N umber of R ecords)以相同的方式工作,但重置为1 at at at每个新文件的开头。所以在这种情况下,它的值将从1到4,然后是1到10。

通过比较这两个值,程序可以确定当前正在处理哪个文件。如果NRFNR相同,我们知道我们在第一个文件中,并使用该行的内容来填充关联数组desc。第一个字段($1)是关键字;我们将其余的字段连接在一起以形成值。

如果NR 等于FNR(它只能更大,永远不会更少),我们知道我们在第二个文件中。在这种情况下,我们首先打印行(我们总是这样做,所以我们只是将其作为无条件而不是重复声明)。然后我们检查是否需要附加描述。如果我们这样做,请在desc数组中查找 - 使用$2(行上第二个以空格分隔的字段,第一个是“#”)作为查找键。