2016-06-21 4 views
0

저는 5 개의 열과 수백만 개의 행을 포함하는 두 개의 매우 큰 파일을 유닉스에 가지고 있습니다.두 파일을 유닉스에서 필드별로 비교하십시오.

예 :

파일 1 : ABC | 고화질 | GHK | IJK | LMN .... ...

있는 File2 : ABC | 고화질 | GHK | IJK | 123 . .. ...

내 작업은 두 개의 큰 파일을 비교하고 다른 열과 행을 찾아야합니다. 예를 들어 출력은 다음과 같습니다. 열 - 행 없음 - 파일 1 - 단어 File2 - 단어.

예 :

5 일 LMN 123

파일은 정말 크다. 나는 awk이 유닉스에서 파일 파싱을하는 가장 빠른 방법이라고 들었다. 출력이 너무 오래 기다릴 수 없기 때문에.

awk를 사용하여이 작업을 수행 할 수 있습니까?

+0

예, 두 파일을 동시에 읽는 것은 어렵지만 하나의 파일에서 모든 입력을 저장 한 다음 두 번째 파일을 읽는 동안 'awk' 스크립트의 정상적인 작동 모드 인 반면'awk '을 사용하여 수행 할 수 있습니다. 무엇을 시도 했습니까? 문제가 발생한 곳은 어디입니까? Perl이나 Python을 사용할 수 있다면, 하나의 파일 전체를 메모리에 저장하는 것을 더 쉽게 피할 수 있습니다. –

+0

Perl을 사용하더라도 atleast는 메모리에있는 한 파일을 버려야합니까? 그런 다음 해당 데이터 구조를 사용하여 두 번째 파일을 비교하십시오. –

+0

아니오; Perl을 사용하면 파일 1에서 한 줄을 읽고 파일 2에서 한 줄을 읽은 다음 줄을 비교하여 차이점을 인쇄합니다. 헹구고 반복하십시오. –

답변

2

paste/awk이 솔루션은 내가 순서를 변경

$ paste -d'|' file1 file2 | 
    awk -F'|' '{w=NF/2; 
       for(i=1;i<=w;i++) 
       if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w); 
       print ""}' 

1 5 lmn 123 

, 그것은 붙여 넣기 일치되면

... 그러나 당신은 쉽게 변경할 수 있습니다, 먼저 필드 수를 줄 번호를 인쇄하는 나에게 많은 의미가 있습니다 두 파일의 행은 전반부 (첫 번째 파일)의 필드를 넘고 후반부 (두 번째 파일)와 비교하여 차이점을 인쇄합니다. awk은 모든 레코드 (줄)에 대한 암시 적 루프를가집니다. 큰 파일로 테스트하지는 않았지만 awk 부분은 중요하지 않습니다 (레코드별로 기록). 나는 얼마나 열심 인 paste인지 모르겠다.하지만 나는 그것이 깜박 거리는 것을 의심한다.

+0

나는 awk에 너무 익숙하지 않다. 이 과정은 어떻게 설명 할 수 있습니까? 또한 대용량 파일의 경우에도 프로세스가 효율적으로 작동합니다. –

+1

@SubhayanBhattacharya :'paste' 명령은 file1의 첫 번째 복사본을 file2의 첫 번째 줄과 동일한 줄에 넣고 '|'('-d '|'때문에). 'awk' 명령은 필 요할 때 필드를 비교하고 인쇄합니다. 'file1'에 5 개의 필드가 있다면, 입력 행에 10 개가 있습니다; 'w'= 5; '$ 1 '과'$ 6','$ 2'와'$ 7' 등을 비교하여 diff를보고합니다. –

관련 문제