다음과 같은 csv 파일(a.csv)이 있습니다(수천 개의 행이 있음).
NMS_NE,,,,,,,,,,,,,,,,,,,,,,,
D,NE Name,IP Address,Site Name,Product UPEI,Product Name,Product Model,NE Status,Serial Number,SW Major Release,SW Minor Release,SW Patch Release,Manufacturing Date,Installation Date ,Into Service Date ,Licensed System ID,License Key,Decommissioning Date,Description,,,,,
X,a155,1.1.1.155,,,,audi,,,4.8,abc48.677,,,,,,,,,,,,,
X,b145,1.1.1.145,,,,bmw,,,4.3,abc43.489,,,,,,,,,,,,,
X,c198,1.1.1.198,,,,vw,,,4.4,abc44.779,,,,,,,,,,,,,
...
다음과 같은 조회 CSV 테이블(b.csv)이 있습니다(수백 개의 행이 있음).
model,product name
bmw,1.16
audi,a3
vw,golf
...
내가 하고 싶은 일은 a.csv에서 "제품 모델"(7열) 값을 가져와서 b.csv 파일에서 값을 확인하는 것입니다. "제품 모델" 값(a.csv의)이 "모델" 값(b.csv의)과 동일한 경우 "제품 이름"을 찾아 b.csv의 일치하는 "모델" 값을 기준으로 "제품"을 바꿉니다. a.csv "모델"은 b.csv의 "제품명"과 연관됩니다. 따라서 출력 파일은 다음과 같아야 합니다.
NMS_NE,,,,,,,,,,,,,,,,,,,,,,,
D,NE Name,IP Address,Site Name,Product UPEI,Product Name,Product Model,NE Status,Serial Number,SW Major Release,SW Minor Release,SW Patch Release,Manufacturing Date,Installation Date ,Into Service Date ,Licensed System ID,License Key,Decommissioning Date,Description,,,,,
X,a155,1.1.1.155,,,,a3,,,4.8,abc48.677,,,,,,,,,,,,,
X,b145,1.1.1.145,,,,1.16,,,4.3,abc43.489,,,,,,,,,,,,,
X,c198,1.1.1.198,,,,golf,,,4.4,abc44.779,,,,,,,,,,,,,
...
간단한 awk 명령으로 이 작업을 어떻게 수행할 수 있나요?
답변1
다음을 시도해 볼 수 있습니다 awk
.
awk 'BEGIN { FS = OFS = ","; } FNR == NR { x[$1] = $2; next; } { if ($7 in x) { $7 = x[$7]; } } 1' b.csv a.csv
섹션 에서는 BEGIN
필드 구분 기호 FS
와 출력 필드 구분 기호 OFS
를 ,
. FNR == NR
는 첫 번째 파일( )을 읽을 때 참인 패턴이므로 열의 키 와 열의 값 으로 배열을 b.csv
만듭니다 . 이전 섹션에서는 두 번째 파일을 읽고 해당 열이 배열의 키로 존재하는지 확인했으며, 그렇다면 값을 변경했습니다.x
$1
$2
$7