如果数据文件的特定字段与映射中的键匹配,则将数据文件中的一个字段替换为映射文件中的值

如果数据文件的特定字段与映射中的键匹配,则将数据文件中的一个字段替换为映射文件中的值

我有两个文件,一个数据库和一个映射文件,其中数据库文件需要根据映射文件进行更新。

database.txt:

cpe:2.3:a:adduser:adduser:3.118:*:*:*:*:*:*:*
cpe:2.3:a:adwaita:adwaita-icon-theme:3.36.1:*:*:*:*:*:*:*
cpe:2.3:a:aircrack:aircrack-ng:1.5.2:*:*:*:*:*:*:*
cpe:2.3:a:alsa:alsa-tools:1.2.2:*:*:*:*:*:*:*
cpe:2.3:a:amass:amass:3.7.3kali1:*:*:*:*:*:*:*
cpe:2.3:a:amass:amass-common:3.7.3kali1:*:*:*:*:*:*:*
cpe:2.3:a:amass:test:3.7.3kali1:*:*:*:*:*:*:*

names.txt

1024cms:1024_cms
10-strike:network_monitor
10web:form_maker
10web:photo_gallery
10web:social_feed_for_instagram
1234n:minicms
12net:login_rebuilder
13thmonkey:udfclient
1kxun:qianxun_yingshi
test:test

我想修改database.txt,如果在映射文件的第二列中找到第 5 个字段,则应将第 4 个字段替换为映射文件中相应的第一列。

因此,在上面的示例中,最后一行database.txtcontainstest位于第 5 个字段中,该字段也在names.txt文件中找到。因此,该行的第四个字段应替换为test并如下所示:

cpe:2.3:a:test:test:3.7.3kali1:*:*:*:*:*:*:*

我尝试过awk -F:但不知道如何比较值

awk -F: 'key[$5]; FNR==NR {key[$5]=1}'  data/database.txt data/name.txt

这没用...

答案1

您可以尝试以下awk程序:

awk -F':' -v OFS=':' 'NR==FNR{map[$2]=$1} NR>FNR && ($5 in map) {$4=map[$5]} NR>FNR' names.txt database.txt 

map这将首先在解析第一个文件(其中 )时在关联数组中生成一个键值数据库NR==FNR

然后,在解析第二个文件时,它将检查第 5 个字段 ( $5) 是否出现在 中map,如果是,则将第 4 个字段替换为关联值map[$5]

NR>FNR它只会在处理第二个文件时打印输出行(由操作块外部的条件指示)。

由于这两个文件都是:用 - 分隔的,因此输入和输出字段分隔符都设置为:(command-line options -F':' -v OFS=':')。

相关内容