![linux: 한 파일에서 다른 파일로 vlookup 사용](https://linux55.com/image/148623/linux%3A%20%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20vlookup%20%EC%82%AC%EC%9A%A9.png)
File2(표준 파일)의 필드를 사용하여 File1에서 일치하는 문자열을 인쇄하고 싶습니다. 아래 awk 명령을 시도했지만 결과의 첫 번째 줄만 인쇄하는 대신 File1 문자열에서 일치하는 모든 필드를 가져오고 싶습니다.
cat File1
AAA,20190221,00-00,100
AAA,20190221,01-00,110
AAA,20190221,02-00,120
BBB,20190221,00-00,110
BBB,20190221,01-00,110
BBB,20190221,02-00,110
CCC,20190221,00-00,110
CCC,20190221,01-00,140
CCC,20190221,02-00,150
cat File2
AAA
BBB
아래 awk 메소드를 사용하고 있습니다.
awk -F"," -f vlookup.awk File1 File2
(cat vlookup.awk)
FNR==NR{
a[$1]=$4
next}
{ if ($1 in a) {print $1"," a[$1]} else {print $1, "NA"} }
내가 얻는 결과는 다음과 같습니다.
AAA,100
BBB,110
NA
하지만 때때로 증가하거나 감소할 수 있는 File1의 모든 값을 인쇄해야 합니다. 내 예상 결과는
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
답변1
AWK 스크립트는 열 1을 인덱스로 사용하여 File1
열 1의 각 키에 대한 열 4의 마지막 값을 배열에 저장합니다 . a
그런 다음 에 있는 모든 배열 키와 값을 인쇄합니다 File2
.
입력 파일의 순서를 변경하고 키 배열을 만든 File2
다음 File1
해당 배열과의 행을 비교해야 합니다.
vlookup2.awk
FNR==NR {
a[$0]=1 # Set a value in array a using current line as index
next # Stop processing this line, do not check other rules
}
$1 in a { # if column1 matches any index in array a
print $1 "," $4 # the columns you want
}
달리기
awk -F "," -f vlookup2.awk File2 File1
얻기 위해
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
참고: 저는 File2를 첫 번째 매개변수로 사용하고 있습니다.
참고: AWK 스크립트, 샘플 파일 및 출력에 문제가 있는 것 같습니다. 두 줄이 나옵니다
AAA,120
BBB,110
이는 File1의 마지막 몇 행이며 열 1의 키에 해당합니다. 예제 출력에는 의 첫 번째 줄이 표시됩니다 AAA
.
줄을 서요
NA
(앞에 공백이 옴 NA
) File2 다음에 빈 줄이 오는 경우에만 해당됩니다 BBB
.