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

Gawk:使用另一个文件中的查找数据插入行,awk,sed,gawk,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 g

我试图在文件中插入行,插入的数据基于另一个文件中存储的数据。我在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
awk '{
    if ($0 ~ /^# [^ ]* --/) {
        print $0;
        print "Description = ";   # How to lookup $2's description??
    } else {
        print $0;
    }
}' <file1.txt
结果应该如下所示:

# 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中了解了很多,但不知道如何引用查找文件:

alpha    This is a description of alpha
gamma    This guys description
delta    And a third description
awk '{
    if ($0 ~ /^# [^ ]* --/) {
        print $0;
        print "Description = ";   # How to lookup $2's description??
    } else {
        print $0;
    }
}' <file1.txt
awk'{
如果($0~/^[^]*-/){
打印$0;
打印“Description=“;#如何查找$2的说明??
}否则{
打印$0;
}

}“您可以这样做,在
awk
命令行上按逻辑顺序提供这两个文件(首先是说明,以便它可以读取和存储它们,然后是需要插入它们的数据):

说明:

awk变量
NR
包含迄今为止看到的NRecords。通常情况下,记录是一行-尽管您可以更改记录分隔符-因此这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,其值将从1运行到14

变量
FNR
FileNnumber ofRecords)的工作方式相同,但在每个新文件的开头重置为1。所以在这种情况下,它的值将从1到4,然后从1到10

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


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

您可以这样做,在
awk
命令行上按逻辑顺序提供两个文件(首先是说明,以便它可以读取和存储它们,然后是需要插入它们的数据):

说明:

awk变量
NR
包含到目前为止看到的NRecords。通常,记录是一行-尽管可以更改记录分隔符-因此这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,其值将从1到14运行。

变量
FNR
FileNnumber ofRecords)的工作方式相同,但在每个新文件的开头重置为1。因此,在这种情况下,其值将从1到4,然后从1到10

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


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

另一个类似的
awk

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

另一个类似的
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;
)做什么呢?我在文档中找不到。这是一个真实的条件,最终调用默认语句,即
print
。因此
1;
相当于
{print}
。谢谢!这完全有效,但是第二行是什么呢(
1;
)怎么办?我在任何文档中都找不到。这是一个真实的条件,最终调用了默认语句
print
。因此
1;
相当于
{print}
。我认为不需要
(NR>FNR)
,在读取第一个文件时循环之后,您可以将
next
不,该循环需要在第一个文件的每一行上运行,而不是在第二个文件上。它在每一行的字段上循环;它怎么可能在每一行上循环?如何帮助
next
呢?我的意思是在
(NR==FNR){desc 1]=2;对于(i=3;i
NR==FNR
仅当
awk
读取第一个文件时才为真,因此
(NR>FNR)
不是必需的,
next
语句用于停止处理当前行,它类似于
continue
语句,因此它将转到下一行,
NR
awk
读取第二个文件时将始终大于
FNR
,但该循环需要在第一个文件的每一行上运行。如果我调用“next there”,我将在数组中只有一个描述!我认为不需要
(NR>FNR)
,在读取第一个文件时循环之后,您可以将
放入下一个
不,该循环需要在第一个文件的每一行上运行,而不是在第二行上运行。它在整个文件上循环