2012-07-17 3 views
1

공통 필드가있는 두 개의 파일이 있습니다. 두 파일을 공통 필드로 병합하고 linux 명령에서 awk을 사용하여 병합 된 파일을 다른 파일에 쓰려고합니다. 파일 2awk를 사용하여 두 파일을 병합하고 출력을 작성하십시오.

412234$sum$file2$address$street 
413233$sum2$file32$address2$street2$path 
414444$$$$ 

이 샘플 파일 $로 구분되며 출력도 $에있을 것입니다 파일을 병합

412234$name1$value1$mark1 
413233$raja$$mark2 
414444$$$ 

파일 1

. 또한이 행에는 빈 필드가 있습니다.

나는 join를 사용하여 스크립트 시도 :

join -t "$" out2.csv out1.csv |sort -un > file3.csv 

을하지만 무슨 일이 있었 총 수의 불일치가있다. awk으로 시도

:

myawk.awk

#!/usr/bin/awk -f 
NR==FNR{a[FNR]=$0;next} {print a[FNR],$2,$3} 

나는 또한 너무 많은 시간을 할애했다 그것을

awk -f myawk.awk out2.csv out1.csv > file3.csv 

을 달렸다. 응답 없음. 여기

out2.csv 마스터 파일이며 우리는 당신이 저를 다른 파일로 병합 된 파일을 작성하는 데 도움이 시겠어요 out1.csv

과 비교해야?

+0

조인을 사용하려면 입력 파일이 이미 정렬해야합니다. 'sort -n'으로 파이핑한다는 것은 아마도 그것들이 정확하게 정렬되지 않았 음을 의미합니다. 사전 적으로 (수치 적으로는 아님) 정렬을 시도한 다음 조인을 사용하고 결과를 숫자로 정렬하십시오. –

답변

3

bash을 사용하여 다음을 실행하십시오. 이렇게하면 당신은 awk 솔루션을 좋은 방향으로했다

join -t'$' -a 1 -a 2 <(sort -k1,1 -t'$' out1.csv) <(sort -k1,1 -t'$' out2.csv) 
+0

그래, 첫 번째 파일 줄이 쓰여지고 두 번째 줄이 다음 줄에 쓰여지고있는 문제입니다. 그래서 열이 제대로 병합되지 않습니다.이 파일을 다시 병합 한 후에 다른 파일과 병합해야합니다. (out3.csv). 동일한 첫 번째 열 필드를 기반으로합니다. – saravanan

+0

Saravanan, join 명령은 2 개의 파일에서 일치하는 행을 나란히 표시합니다. CRLF 문자로 라인이 종료되지 않았는지 확인하십시오. – iruvar

1

완전 외부 조인의 상당을 제공합니다. 주요 포인트는 $으로 필드를 분할 FS을 변경했다 : script.awk

내용 :

awk ' 
    BEGIN { 
     ## Split fields with "$". 
     FS = "$" 
    } 

    ## Save lines from second file, the first field as the index of the 
    ## array, and rest of the line as the value. 
    FNR == NR { 
     file2[ $1 ] = substr($0, index($0, "$")) 
     next 
    } 

    ## Print when keys from both files match. 
    FNR < NR { 
     if ($1 in file2) { 
      printf "%s$%s\n", $0, file2[ $1 ] 
     } 
    } 
' out2.csv out1.csv 

출력 :

412234$name1$value1$mark1$$sum$file2$address$street 
413233$raja$$mark2$$sum2$file32$address2$street2$path 
414444$$$$$$$$ 
관련 문제