我试图将行插入文件,其中插入的数据基于存储在另一个文件中的数据。我已经在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从第二个文件中获取说明?或者有更好的工具吗?谢谢!
答案 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。
通过比较这两个值,程序可以确定当前正在处理哪个文件。如果NR
和FNR
相同,我们知道我们在第一个文件中,并使用该行的内容来填充关联数组desc
。第一个字段($1
)是关键字;我们将其余的字段连接在一起以形成值。
如果NR
不等于FNR
(它只能更大,永远不会更少),我们知道我们在第二个文件中。在这种情况下,我们首先打印行(我们总是这样做,所以我们只是将其作为无条件而不是重复声明)。然后我们检查是否需要附加描述。如果我们这样做,请在desc
数组中查找 - 使用$2
(行上第二个以空格分隔的字段,第一个是“#”)作为查找键。