데이터 파일의 특정 필드가 맵의 키와 일치하는 경우 데이터 파일의 필드를 맵 파일의 값으로 바꿉니다.

데이터 파일의 특정 필드가 맵의 키와 일치하는 경우 데이터 파일의 필드를 맵 파일의 값으로 바꿉니다.

데이터베이스와 매핑 파일이라는 두 개의 파일이 있는데, 매핑 파일을 기반으로 데이터베이스 파일을 업데이트해야 합니다.

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따라서 행의 네 번째 필드는 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=':')으로 설정됩니다.

관련 정보