BashとAWKを使用したテキストファイルの比較

BashとAWKを使用したテキストファイルの比較

2つのテキストファイルがあり、行と列に基づいてその値を比較したいと思います。比較すると、値が等しいことを確認し、値が等しいかエコーすることを意味します。ファイルは次のようになります。

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

2つの異なるテキストファイルの値を比較するには?さらに説明が必要な場合はお知らせください。

私が求めているのは、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

おすすめ記事