2014-01-20 3 views
2

다른 파일을 기반으로 한 파일에서 데이터를 추출하려고합니다. file1의 하위 문자열은 file2에서 일치하는 항목을 찾기위한 색인 역할을합니다. 검색 할 문자열 file2가 공백 또는 분리되어있을 때 모두 작동하지만 awk에서 찾을 수없는 다른 필드에 조인 할 때 작동합니다. awk가 file2의 문자열의 일부와 일치하도록하는 방법이 있습니까? 작동awk with joined fields

awk -vv1="$Var1" -vv2="$var2" ' 
    NR==FNR { 
     if ($4==v1 && $5==v2) { 
      s=substr($0,4,8) 
     echo $s 
      a[s]++ 
     } 
     next 
    } 
    !($1 in a) { 
     print 
    }' /tmp/file1 /tmp/file2 

예 : 파일 1 :

1 554545352014-01-21  2014-01-21T16:18:01  FS 14001 1   1.10 
1 554545362014-01-21  2014-01-21T16:18:08  FS 14002 1   5.50 

파일 2 :

55454535 11  17 102 850Sande Fiambre 1.000 
55454536 11  17 17 238Pesc. Dourada 1.000 

예를 작동하지 않습니다

파일 2를 :

5545453501/21/20142  1716:18 1 1  116:18 
5545453601/21/20142  1716:18 1 1  216:18 

검색 할 문자열입니다 (예 : 55454535는 실제 예제에서 일치하는 항목을 찾았지만 아래쪽 항목에는 일치하지 않습니다).

+0

'a' 매치를'a'를 반복하는 루프로 바꾸고'~'정규 표현식을 사용하여 각 항목에 대해 매치시켜야합니다. –

+1

awk 스크립트의 중간에서 가짜 쉘 명령'echo $ s'을 제거하십시오. awk는 그것을 빈 변수'echo'의 문자열 연결과 변수's'에 포함 된 숫자로 색인 된 필드로 봅니다. 그래서's'가'55454535'로 설정되면'$ 55454535 '. –

+0

@ Ed Morton, 그리고 에코 $ 대신에 무엇을 사용하는 것이 좋습니다? –

답변

2

당신을 이를 대체 할 :

!($1 in a) { 
    print 
} 
이와

(또는 유사한 - 당신의 요구 사항이 불분명)의 난 당신이 필요로 갈 생각에 대답 bdrx하기 위해 귀하의 의견을 감안

{ 
    found = 0 
    for (s in a) { 
     if ($1 ~ "^"s) { 
      found = 1 
     } 
    } 
    if (!found) { 
     print 
    } 
} 
+1

그게 전부 야. 그것은 완벽하게 작동합니다. 인쇄 대신 후 처리를 위해 변수에 결과를 포착했지만 효과가 있습니다. 감사 –

1

==

대신에 정규식 비교 ~를 사용하십시오. 경우 ($ 4 ~ V1 & ~ V2 & $ 5) 당신은 단지 문자열로 시작하고 당신이 단어를 원하는 $ 경우 말씀을 원하는 경우

앞에 추가 V1/V2와^만에 종료 아마

+0

그 경우에는 비교가 이루어집니다 : ! ($ 1) 거기에서 정규식 비교를 어떻게 사용합니까? –