我有两个文件,一个数据库和一个映射文件,其中数据库文件需要根据映射文件进行更新。
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.txt
containstest
位于第 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=':'
)。