Unixで2つの異なるファイルを1行ずつ比較するには?

Unixで2つの異なるファイルを1行ずつ比較するには?

ファイル1:

123
234
345
456

ファイル2:

123
234
343
758

期待される出力:ファイル3:

TRUE
TRUE
FALSE
FALSE

したがって、コードは2つのファイルを比較して一致する場合は「TRUE」を印刷し、そうでない場合は新しいファイルに「FALSE」を印刷する必要があります。誰でもこれに解決策を提供できますか?

答え1

または、他のサポートされているシェルでdiff次のコマンドを使用します。bash<(...) プロセスの交換または次のように真似できます。:

diff --new-line-format='FALSE'$'\n' \
     --old-line-format='' \
     --unchanged-line-format='TRUE'$'\n' \
<(nl file1) <(nl file2)

出力は次のとおりです。

TRUE
TRUE
FALSE
FALSE

--new-line-format='FALSE'$'\n'、印刷FALSE行が異なり、--old-line-format=''file1 の行が異なる場合、出力を無効にする場合はそれを呼び出します。古いファイルをdiffコマンドに切り替えることもできます。つまり、1つは印刷しFALSE、もう1つは無効にする必要があることを意味します。

--unchanged-line-format='TRUE'$'\n'、印刷TRUE行が同じ場合。 C$'\n'スタイルのエスケープ構文は、各出力行の後に新しい行を印刷するために使用されます。

答え2

ファイルにタブ文字が含まれていないとします。

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE

pasteこれは、2つの列にある2つのファイルの内容を含む2つのタブで区切られた列を作成するために使用されます。このawkコマンドは、各行の2つの列を比較して、TRUE2つの列が等しいかどうかを印刷し、そうでない場合は印刷しますFALSE

答え3

2つのファイルの行数が同じであるとします。

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1

比較する文字列が数値の場合は数値比較が実行され、それ以外の場合は語彙比較が実行されます。たとえば、1001.0e2同じと見なされます。f2"" == $0すべての場合に語彙比較を強制するように変更されました。

実装に応じて、語彙比較は、using(バイト間比較)またはusing(2つの文字列がロケールの照合順序で等しくソートされるかどうか)などのようにawk行われます。これは、例のように、すべての10進数入力ではなく、特定の文字シーケンスが正しく定義されていない一部のロケールに影響を与える可能性があります。memcmp()strcoll()

答え4

ループ内のbash各ファイルを読み込みwhile、読み取った行と印刷した行を比較するTRUEFALSE、適切に次の操作を行います。

while IFS= read -r -u3 line1; IFS= read -r -u4 line2; do
    [[ $line1 == $line2 ]] && echo TRUE || echo FALSE
done 3<file1 4<file2

これら 2 つの呼び出しは、readそれぞれファイル記述子 3 と 4 から読み取られます。ファイルは、ループの2つの入力リダイレクトを介してこれらのファイルにリダイレクトされます。

関連情報