일치 항목을 기반으로 한 파일의 필드를 다른 파일의 다른 필드로 바꿉니다.

일치 항목을 기반으로 한 파일의 필드를 다른 파일의 다른 필드로 바꿉니다.

이 작업에 도움을 주셔서 감사합니다.

파일 A에는 4개의 필드와 90K 줄이 있습니다. 다음 조건이 true인 경우 첫 번째 필드(열 1)의 값을 변경해야 합니다. 네 번째 필드(4열)에는 파일 B에서 참조된 데이터가 포함됩니다. 파일 A의 데이터는 탭으로 구분된 DNS 레코드입니다.

Owner IN Type RData

파일 A:

hostname1 IN A 10.10.20.1 
hostname2 IN A 10.10.20.2 
hostname3 IN A 10.10.20.3

파일 B:

10.10.20.1 
10.10.20.2 
10.10.20.58 
10.10.21.245 
10.10.23.7

파일 B는 단일 열(1개 필드)과 1400개의 행입니다. 파일 B의 데이터는 IP 주소입니다.

요구 사항: 파일 B의 각 줄에 대해 파일 A의 네 번째 필드가 일치하면 파일 A의 첫 번째 필드 내용을 바꿉니다.

영어: 파일 B에 나열된 각 IP에 대해 파일 A의 소유자 값을 특정 값으로 바꿉니다.

답변1

(내 답변에 따라 수정되었습니다.여기...)

당신은 비교할 수 있습니다NR그리고FNR첫 번째 파일 처리와 후속 파일 처리를 구별합니다. 이는 FNR재설정이 파일 기준 NR이 아니라 실행 횟수 기준이기 때문입니다 . 따라서 첫 번째 파일이 처리될 때만 조건이 충족됩니다 NR==FNR.

첫 번째 프로세스 FileB...

awk 'NR==FNR{a[$1]=1}'

값을 "dummy"와 같은 것으로 설정하면 1충분합니다.

그런 다음 FileA를 처리합니다...

awk -F'\t' 'BEGIN{OFS=FS}NR!=FNR{if(a[$4]){$1="Reserved"};print}'

여기서는 전체 행( )을 다시 작성할 때 서식을 유지하도록 출력 필드 구분 기호가 OFS설정되어 있습니다 .FSawk$0

두 가지를 합치면 다음과 같습니다.

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1}NR!=FNR{if(a[$4]){$1="Reserved"};print}' FileB FileA

조금 더 원하신다면간결...

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1;next}a[$4]{$1="Reserved"}1' FileB FileA

next처리를 위해첫 번째1파일은 실행인 최종 인쇄를 건너뜁니다 {print $0}. 이러한 방식으로 조건 a[$4](즉, true존재하는 경우 r)을 "out" $1으로 변경해야 하는지 여부를 결정하는 조건 으로 바꿀 수 있습니다 "Reserved".

답변2

다음 방법으로 이를 수행할 수 있습니다 awk.

awk -F"\t" '{if(NF==1){arr[$1]=$1}else{if(arr[$4]==$4){$1="Reserved"}{print $0}}}' fileB, FileA

상수 변수는 NF파일의 필드 수를 나타냅니다. 이 코드에서는 awkFileB가 먼저 읽혀지고 모든 데이터가 arrFileA에 명명된 배열에 저장됩니다. 네 번째 필드 $4= 배열 ​​값(IP 주소) 인 경우 호스트 이름을 예약됨으로 바꿉니다.

샘플에서 다음이 출력됩니다.

Reserved IN A 10.10.20.1 
Reserved IN A 10.10.20.2 
hostname3 IN A 10.10.20.3

관련 정보