2014-06-18 3 views
0

두 개의 텍스트 파일이 있고 행과 열에 따라 해당 값을 비교하려고합니다. 비교하면, 값이 같은지 여부를 확인하고 값이 같거나 같지 않으면 echo을 확인합니다. 다음 파일은 다음과 같습니다bash에서 두 텍스트 파일의 행과 열 값을 비교하는 방법은 무엇입니까?

은 File2.txt

Name Col1 Col2 Col3 
----------------------- 
row1 1  4  7   
row2 2  5  8   
row3 3  6  9 

file2.txt 여기

Name Col1 Col2 Col3 
----------------------- 
row2 1  4  11   
row1 2  5  12   

이 제한됩니다 보낸 사람 :

  • 이 존재 행만 (즉, 비교 row3은 file1.txt에 있지만 file2.txt에는 존재하지 않으므로 비교가 필요하지 않습니다.)
  • 한 번에 한 행과 한 열을 비교해야합니다.
  • 파일에 순서가있을 수 있습니다 awk
  • 행을 사용해야합니다

나는이 같은 것을 생각하고 :

awk 'NR>2 
    for (i=2;i<NR;i++)    #for each row of file1.txt 
    {  
     for(j=1;i<NF;j++)   #for each column of file1.txt 
     { 
      // check if row and column of file1.txt is equal to row and column of file2.txt 
     } 
    } 

' file1.txt file2.txt 

그래서 모든 실례 bash는 초보자입니다 내 실수. 이게 가능한가? 또한 두 개의 다른 텍스트 파일의 값을 비교하는 방법은 무엇입니까? 감사. 더 자세한 설명이 필요한 경우 알려주십시오.

+1

을 ... 나는 학술 설정에서 어떤 종류의 연습으로 사용할 것입니다. –

+1

예상 출력을 표시 할 수 있습니까? – anubhava

+0

아니요. 나는 정확한 산출물이이 질문에서 무엇을 얻으려고하는지 정확히 알 수 없었다. – anubhava

답변

2

분명히 이것은 숙제 문제이므로 분명히 알려 드리겠습니다. 세부 정보를 얻을 수있는 곳을 읽으려면 awk 서적이 있어야합니다.

NR을 사용하는 방식이 잘못되었습니다. 그것은 총 레코드 수는 아니지만 현재 레코드의 수입니다.

awk 스크립트는 각각 pattern {actions} 양식의 규칙 목록임을 기억하십시오. 따라서 프로그램은 가능한 한 많은 형태로 이루어져야합니다. awk의 기본 메커니즘은 레코드를 읽고, 차례대로 각 규칙의 패턴에 대해 테스트하고, 패턴과 일치하면 연관된 작업을 실행하고, 규칙의 끝에 도달하면 다음 레코드로 이동합니다. 예를 들어 C 또는 Java와 같은 언어와 매우 다른 "데이터 중심"입니다.

은이 같은 초기 규칙과 두 파일의 첫 두 줄을 건너 뛸 수 있습니다

FNR < 3 { next } # if file record number < 3, go to next record 

두 개의 파일을 처리하는 관용적 인 방법이있다. NR == FNR (파일 레코드 번호)은 파일간에 재설정되는 반면 NR (레코드 번호)은 파일간에 증가하기 때문에 첫 번째 파일에서만 FNR이 true입니다. 그래서 당신은이 작업을 수행 할 수 있습니다

NR == FNR { 
    # Only the first file's records will be processed here 

    next # go on to the next record 
} 

을 첫 번째 파일을 처리하는 동안, 당신은 첫 번째 필드에서 키가 레코드를 저장하는 연관 배열을 사용하는 것이 좋습니다.

최종 규칙은 첫 번째 필드가 연관 배열의 키인지 테스트하고, 일치하는 경우 다른 필드를 비교하여 일치하는지 확인하는 두 번째 파일 만 처리합니다.

그래서 프로그램이이 구조를 가지고 있습니다 확실히 제약이 많이 있습니다

FNR < 3 { next } # if file record number < 3, go to next record 

NR == FNR { 
    # Only the first file's records will be processed here 

    # Save info in an associative array. 
    aa[$1] = ... 

    next # go on to the next record 
} 

# If a rule has no pattern, it matches every record 
{ 
    # Only the second file's records will be processed here 

    if ($1 in aa) { 
     # compare fields 
    } 
} 
관련 문제