이 작업에 도움을 주셔서 감사합니다.
파일 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
설정되어 있습니다 .FS
awk
$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
파일의 필드 수를 나타냅니다. 이 코드에서는awk
FileB가 먼저 읽혀지고 모든 데이터가arr
FileA에 명명된 배열에 저장됩니다. 네 번째 필드$4
= 배열 값(IP 주소) 인 경우 호스트 이름을 예약됨으로 바꿉니다.
샘플에서 다음이 출력됩니다.
Reserved IN A 10.10.20.1
Reserved IN A 10.10.20.2
hostname3 IN A 10.10.20.3