2017-09-16 3 views
-1

좋은 하루 두 파일을 비교. 친절한 도움을 찾고 있습니다.은 검색 키

나는 두 개의 파일을 비교하고 싶습니다. 모의 업 파일 1의 내용과 아래 파일 2 같습니다

파일 1 :

50  0004312805201  06740   2310821                                 
50  0004986504201  00845   2310837                                 
50  0003913155201  47679   2310762                                 
50  0004997395201  2035   2311180                                 
50  0001147242201  15000   23108723                                 
50  0005771878201  13545   I3840000  

파일 2 :

0003913155 A 

0005771878 A 

0004312805 A 

0000000015 B 

0000000012 B 

1111111111 E 

내가 생산하는 FILE1에서 FIELD2에 substring을 수행해야 10 character length searchable key value이고 file2의 field1에서 일치하는 값을 찾습니다.

일치하는 것이 발견되면 file2의 field2가 새 필드로 추가 된 전체 file1 행을 인쇄하십시오.

일치하는 항목이없는 경우 전체 필드 1 행에 "NO"라는 문자열을 새 필드로 추가하여 인쇄하십시오. 출력은 파일로 가장 잘 전달됩니다.

출력 예는 다음과 같습니다.

출력 :

50  0004312805201  06740   2310821 A                                
50  0004986504201  00845   2310837 NO                                
50  0003913155201  47679   2310762 A                                
50  0004997395201  2035   2311180 NO                                
50  0001147242201  15000   23108723 NO                                
50  0005771878201  13545   I3840000 A 

어떻게 너희들은 내가 awk 또는 GNU-awk를 통해이 문제를 해결 제안? 검색 가능한 키 하위 문자열을 준비하고 배열을 작성하는 데 awk/GNU-awk에서 사용하는 데 문제가 있습니다.

도움을 주시면 감사하겠습니다. 나는이 시점에서 내 바퀴를 돌리고있다.

감사합니다.

+1

*는 10 문자 길이 검색 키 *를 생산하기를 AWK 출력을 생성합니다? – RomanPerekhrest

+0

[awk를 사용하여 로그 파일의 열을 일치시키고 전체 행을 인쇄 할 수 있습니다] (https://stackoverflow.com/questions/22076186/using-awk-to-match-a-column-in-log-file) -and-print-the-entire-line) – tk421

답변

1
awk ' 
    FNR==NR{ a[$1]=$2; next } 
    { s=substr($2,1,10); print $0,(s in a ?a[s]:"No") } 
    ' file2 file1 > your_output_file 

입력 :

$ cat file1 
50 0004312805201 06740 2310821 
50 0004986504201 00845 2310837 
50 0003913155201 47679 2310762 
50 0004997395201 2035 2311180 
50 0001147242201 15000 23108723 
50 0005771878201 13545 I3840000 

$ cat file2 
0003913155 A 
0005771878 A 
0004312805 A 
0000000015 B 
0000000012 B 
1111111111 E 

출력 produce a 10 character length searchable key value으로 무엇을 의미하는지 OP

$ awk 'FNR==NR{a[$1]=$2;next}{s=substr($2,1,10);print $0, (s in a ? a[s] : "No") }' file2 file1 
50 0004312805201 06740 2310821 A 
50 0004986504201 00845 2310837 No 
50 0003913155201 47679 2310762 A 
50 0004997395201 2035 2311180 No 
50 0001147242201 15000 23108723 No 
50 0005771878201 13545 I3840000 A 
+0

내일 제공된 의견을 검토하고 의견으로 답장 해 드리겠습니다. 응답 한 모든 사람들에게 감사드립니다. – jadeabc

0

확실하지. 나는 다음과 같이 해석한다 : file2의 필드 1의 값은 file1의 필드 2의 부분 문자열이어야한다..

$ cat file1 
50 0004312805201 06740 2310821 
50 0004986504201 00845 2310837 
50 0003913155201 47679 2310762 
50 0004997395201 2035 2311180 
50 0001147242201 15000 23108723 
50 0005771878201 13545 I3840000 

의 입력

$ cat file2 
0003913155 A 

0005771878 A 

0004312805 A 

0000000015 B 

0000000012 B 

1111111111 E 

호출 TST와

$ cat tst.awk 
/^[0-9]/ && NR==FNR { a[$1]=$2; next } # read values from file2 in array 
/^[0-9]/{ 
    f=0; 
    for (i in a){       # loop over field 1 of file2 
     if (index($2, i)){     # if i can be found in field 2 of file1 
     print $0, a[i];     # print $0 with $2 from file2 
     f++; 
     break; 
     } 
    } 
} 
/^[0-9]/ && !f{ print $0, "NO" }   # if no match, print "NO" line 

.사용하는 oneliner

$ awk -f tst.awk file2 file1 
50 0004312805201 06740 2310821 A 
50 0004986504201 00845 2310837 NO 
50 0003913155201 47679 2310762 A 
50 0004997395201 2035 2311180 NO 
50 0001147242201 15000 23108723 NO 
50 0005771878201 13545 I3840000 A 

또는 : - 해당 키 필드의 처음부터 시작하지 못했습니다

$ awk '/^[0-9]/ && NR==FNR { a[$1]=$2; next } /^[0-9]/{f=0;for (i in a){if (index($2, i)){print $0, a[i];f++;break;}}}/^[0-9]/ && !f{ print $0, "NO" }' file2 file1