ファイル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つの列を比較して、TRUE
2つの列が等しいかどうかを印刷し、そうでない場合は印刷しますFALSE
。
答え3
2つのファイルの行数が同じであるとします。
awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1
比較する文字列が数値の場合は数値比較が実行され、それ以外の場合は語彙比較が実行されます。たとえば、100
と1.0e2
同じと見なされます。f2"" == $0
すべての場合に語彙比較を強制するように変更されました。
実装に応じて、語彙比較は、using(バイト間比較)またはusing(2つの文字列がロケールの照合順序で等しくソートされるかどうか)などのようにawk
行われます。これは、例のように、すべての10進数入力ではなく、特定の文字シーケンスが正しく定義されていない一部のロケールに影響を与える可能性があります。memcmp()
strcoll()
答え4
ループ内のbash
各ファイルを読み込みwhile
、読み取った行と印刷した行を比較するTRUE
かFALSE
、適切に次の操作を行います。
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つの入力リダイレクトを介してこれらのファイルにリダイレクトされます。