区切り文字なしで2つのファイルの特定の場所を比較する方法

区切り文字なしで2つのファイルの特定の場所を比較する方法

2つのファイルを1行ずつ比較する必要があります。私は他の行だけを出力したいのですが、違いを判断するときは、文字4-6と10-12は無視する必要があります。特定のフィールド区切り記号などはありません。

例:

  • ファイル1
    abc123def999
    ghi456klm999
    nop789qrs999
    
  • ファイル2
    abc000def000
    xxx000yyy000
    nop000qrs000
    

この例では、2番目の行だけが異なる必要があります。

readファイルには何百万ものレコードがあるため、ループがファイルを1行ずつ解析することは望ましくありません。

ベストアンサー1

GNU awkをFIELDWIDTHSパラメータとして使用する:

$ paste file[12] |
    awk -v FIELDWIDTHS='3 3 3 3 1 3 3 3 3' '$1!=$6 || $3!=$8'
ghi456klm999    xxx000yyy000

pasteここでは、2つのファイルを並べて貼り付けるコマンドを使用します。次に、awkのFIELDWIDTHSパラメーターを使用してフィールド長を定義するため、2つのファイルの行が固定長であると仮定し、ここで関連フィールドの違いを比較します。一行ずつ行われます。

または、すべてのシェルで awk を使用します。

$ paste file[12] |
    awk 'function key(s){return substr(s,1,3) substr(s,7,3)} key($1) != key($2)'
ghi456klm999    xxx000yyy000

おすすめ記事