2017-01-16 4 views
1

내가 파일에 1 열의 AWK를 사용하여 대소 문자를 구분하지 VLOOKUP을 할 노력하고있어,하지만이 IGNORECASE을 무시하고 또한 3 열을 비교하는 방법 같은 AWK를 사용하여 소문자 일치하지 않는대소 문자를 구분하지 AWK의 VLOOKUP

awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}' 

cat f1.txt 
FOO,LONDON,45,789 
goo,US,46,9876 

cat f2.txt 
FOO,LONDON,45,789 
GOO,US,46,9876 


awk -F, 'BEGIN{IGNORECASE=1} FNR==NR{a[$1]=$3","$4;next} {print (($1 in a) ? $0","a[$1] : $0",NA,NA");}' f1.txt f2.txt 

FOO,LONDON,45,789,45,789 
GOO,US,46,9876,NA,NA 

답변

0

둔한 특정 할 또 다른 방법은, 0이 아닌 값으로 IGNORECASE 변수를 설정하는 것, GNU Awk 페이지로부터 발췌 한 참조 (내장 변수 참조). IGNORECASE가 0이 아닌 경우 모든 regexp 및 string 연산은 대/소문자를 무시합니다.

일반적으로 특정 규칙 패턴에만 IGNORECASE를 설정하는 직접적인 방법이 없으므로 IGNORECASE를 사용하여 특정 규칙을 대/소문자를 구분하지 않고 다른 규칙을 대/소문자를 구분할 수는 없습니다 .17 이렇게하려면 대괄호 식 또는 tolower() 그러나 IGNORECASE로 수행 할 수있는 작업은 모든 규칙에 대해 대/소문자 민감도를 동적으로 켜거나 끄는 것입니다.

그래서, 같은 입력은 (배열에 실 거예요 작업 IGNORECASE 온라인에 대한 참조를 가지고) 작동 네

awk -F, 'FNR==NR{a[tolower($1)]=$3","$4;next} {print ((tolower($1) in a) ? $0","a[tolower($1)] : $0",NA,NA");}' f1.txt f2.txt 
FOO,LONDON,45,789,45,789 
GOO,US,46,9876,46,9876 
+0

GNU Awk'stolower() 함수를 사용하는 방법 대신 첫 번째 열 –

+0

의 3 열에 대한 패턴 일치에 @ Inian, 첫 번째 열 대신에 세 번째 열에 패턴 매치하는 법. 두 파일 모두 대문자와 소문자가 혼합 된 조합으로,이 경우 소문자로 변환되어 일치를 수행합니다. –

+0

@ sam_84 :이 주제를 벗어나는 완전히 새로운 질문입니다. 입력과 출력이 필요한 새 것으로 요청할 수 있습니까? – Inian