Bash 및 AWK를 사용하여 텍스트 파일 비교

Bash 및 AWK를 사용하여 텍스트 파일 비교

두 개의 텍스트 파일이 있는데 행과 열을 기준으로 해당 값을 비교하고 싶습니다. 비교하자면, 값이 같은지 확인하고 값이 같은지 에코하는 것을 의미합니다. 파일은 다음과 같습니다.

file1.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 버전이 지원하지 않기 때문에 이중 배열이 없습니다.

나는 다음과 같은 것을 생각하고 있습니다 :

awk 'NR>2 {next}
{
    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

두 개의 서로 다른 텍스트 파일의 값을 비교하는 방법은 무엇입니까? 더 많은 설명이 필요하면 알려주시기 바랍니다.

내가 요구하는 것은 AWK의 공통 구성을 사용하는 것뿐입니다. 나머지는 알아낼 수 있기를 바랍니다.

답변1

그러면 두 파일 모두에 이름이 존재하지만 값이 다른 file2의 행이 출력됩니다.

awk 'NR==FNR {f1[$1]=$0; next} $1 in f1 && $0 != f1[$1]' file1.txt file2.txt 
row2  1     4     11        
row1  2     5     12

공백의 차이조차도 잘못된 결과를 낳을 수 있다는 것을 깨달았습니다. 다음 줄을 "정규화"할 수 있습니다.

awk '
    NR==FNR  {$1=$1; f1[$1]=$0; next} 
    $1 in f1 {$1=$1; if ($0 != f1[$1]) print}
' file1.txt file2.txt 
row2 1 4 11
row1 2 5 12

답변2

gawk 4.x이를 수행하는 방법에는 여러 가지가 있습니다 . 해결책은 다음과 같습니다 .

$ awk '
    FNR < 2 { next }
    FNR == NR {
        for (i = 2; i <= NF; i++) {
            a[$1][i] = $i;
        }
        next;
    }
    ($1 in a) {
      for (i = 2; i <= NF; i++) {
          if (a[$1][i] == $i) {
              printf("%s->Col%d: Equal\n", $1, i-1);
          } else {
              printf("%s->Col%d: Not Equal\n", $1, i-1);
          }
       }
  }
' file1.txt file2.txt
row2->Col1: Not Equal
row2->Col2: Not Equal
row2->Col3: Not Equal
row1->Col1: Not Equal
row1->Col2: Not Equal
row1->Col3: Not Equal

설명하다

  • FNR < 2 { next }: 처음 두 줄을 건너뜁니다.
  • FNR == NR: 첫 번째 파일을 처리하는 경우에만 true입니다. 각 열 값을 연관 배열 a형식으로 저장합니다 a[ROW][COLUMN].
  • ($1 in a): file2의 행이 file1에 존재하는지 확인합니다. true인 경우 모든 열 값을 반복하여 file1의 값과 비교합니다.

이전 gawk버전의 경우 다음을 시도해 볼 수 있습니다.

$ awk '
    FNR < 2 { next }
    FNR == NR {
        for (i = 2; i <= NF; i++) {
            a[i,$1] = $i;
            b[$1];
        }
        next;
    }
    ($1 in b) {
      for (i = 2; i <= NF; i++) {
          if (a[i,$1] == $i) {
              printf("%s->Col%d: Equal\n", $1, i-1);
          } else {
              printf("%s->Col%d: Not Equal\n", $1, i-1);
          }
       }
  }
' file1.txt file2.txt

답변3

for 루프 내에서 다음을 시도해 보세요.

awk ' {
      if(i == j)
           print "Same value";
      else
           print "Not the same";
       }'

다음은 도움이 될 수 있는 간단한 조건문이지만 두 개의 서로 다른 텍스트 파일을 비교하여 추가 조정이 필요할 수 있습니다.

관련 정보