Gawk:使用另一个文件中的查找数据插入行
我试图在文件中插入行,插入的数据基于另一个文件中存储的数据。我在Sed和Awk中都试过,但都不知道如何访问第二个文件。这对Sed来说可能是一个延伸,而对Awk来说可能不是这样 主文件: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
# 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
包含迄今为止看到的N个Records。通常情况下,记录是一行-尽管您可以更改记录分隔符-因此这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,其值将从1运行到14
变量FNR
(FileNnumber ofRecords)的工作方式相同,但在每个新文件的开头重置为1。所以在这种情况下,它的值将从1到4,然后从1到10
通过比较这两个值,程序可以确定当前正在处理的文件。如果NR
和FNR
相同,我们就知道我们在第一个文件中,并使用该行的内容填充关联数组desc
。第一个字段($1
)是键;我们将其余字段连接在一起以形成值
如果NR
不等于FNR
(它只能更大,不能更小),我们就知道我们在第二个文件中。在这种情况下,我们首先打印行(我们总是这样做,所以我们只是使其无条件,而不是重复该语句)。然后我们检查是否需要附加描述。如果我们这样做,在desc
数组中查找它-使用$2
(行上第二个空格分隔的字段,第一个是“#”)作为查找键。您可以这样做,在awk
命令行上按逻辑顺序提供两个文件(首先是说明,以便它可以读取和存储它们,然后是需要插入它们的数据):
说明:
awk变量NR
包含到目前为止看到的N个Records。通常,记录是一行-尽管可以更改记录分隔符-因此这实际上是当前行号,在所有正在处理的文件中连续计数。在这种情况下,其值将从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;iNR==FNR
仅当awk
读取第一个文件时才为真,因此(NR>FNR)
不是必需的,next
语句用于停止处理当前行,它类似于continue
语句,因此它将转到下一行,NR
在awk
读取第二个文件时将始终大于FNR
,但该循环需要在第一个文件的每一行上运行。如果我调用“next there”,我将在数组中只有一个描述!我认为不需要(NR>FNR)
,在读取第一个文件时循环之后,您可以将放入下一个不,该循环需要在第一个文件的每一行上运行,而不是在第二行上运行。它在整个文件上循环