データベースとマッピングファイルの2つのファイルがあります。マッピングファイルに基づいてデータベースファイルを更新する必要があります。
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
マッピングファイルの2番目の列に5番目のフィールドがある場合は、4番目のフィールドをマッピングファイルの対応する1番目の列に置き換えるように変更したいと思います。
したがって、上記の例にdatabase.txt
含まれている最後の行は、ファイルにも見つかるtest
5番目のフィールドにあります。names.txt
したがって、行の4番目のフィールドは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
次に、2番目のファイルを解析するときに5番目のフィールド()が表示されていることを確認しmap
、その場合は4番目のフィールドを関連する値に置き換えますmap[$5]
。
NR>FNR
2番目のファイルを処理するとき(アクションブロックの外側の条件として表示)、出力行のみを印刷します。
どちらのファイルも:
- で区切られているため、入力フィールドと出力フィールドの区切り文字は:
(コマンドラインオプション-F':' -v OFS=':'
)に設定されます。