데이터베이스와 매핑 파일이라는 두 개의 파일이 있는데, 매핑 파일을 기반으로 데이터베이스 파일을 업데이트해야 합니다.
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
따라서 행의 네 번째 필드는 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
이는 첫 번째 파일(where)을 구문 분석할 때 먼저 연관 배열에 키-값 데이터베이스를 생성합니다 NR==FNR
.
$5
그런 다음 두 번째 파일을 구문 분석할 때 5번째 필드( )가 나타나는지 확인하고 map
, 그렇다면 4번째 필드를 연관된 값으로 바꿉니다 map[$5]
.
NR>FNR
두 번째 파일을 처리할 때(액션 블록 외부의 조건으로 표시됨) 출력 행만 인쇄합니다.
두 파일 모두 :
-로 구분되어 있으므로 입력 및 출력 필드 구분 기호는 :
(명령줄 옵션 -F':' -v OFS=':'
)으로 설정됩니다.