データファイルの特定のフィールドがマップのキーと一致する場合は、データファイルのフィールドをマップファイルの値に置き換えます。

データファイルの特定のフィールドがマップのキーと一致する場合は、データファイルのフィールドをマップファイルの値に置き換えます。

データベースとマッピングファイルの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含まれている最後の行は、ファイルにも見つかるtest5番目のフィールドにあります。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>FNR2番目のファイルを処理するとき(アクションブロックの外側の条件として表示)、出力行のみを印刷します。

どちらのファイルも:- で区切られているため、入力フィールドと出力フィールドの区切り文字は:(コマンドラインオプション-F':' -v OFS=':')に設定されます。

おすすめ記事