ファイル1:
123
234
345
456
ファイル2:
123
234
343
758
予期される出力:File3:
TRUE
TRUE
FALSE
FALSE
そのため、コードは2つのファイルを比較し、一致する場合は「TRUE」を出力し、それ以外の場合は新しいファイルに「FALSE」を出力する必要があります。誰かがこの解決策を提供してくれませんか?
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
、printFALSE
行が異なっていて--old-line-format=''
oldと呼ばれるfile1の行が異なる場合、出力を無効にします。diffコマンド(これらも同様に交換できます。それらはFALSE
を出力するはずです。もう1つは無効にする必要があります。)
--unchanged-line-format='TRUE'$'\n'
、行が同じ場合はTRUE
を出力します。 $'\n'
Cスタイルのエスケープ構文を使用して、各行の出力後に新しい行を出力します。
ファイルにタブ文字が含まれていないと仮定します。
$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE
これは、paste
を使用して2つのタブ区切りの列を作成し、2つのファイルの内容をいずれかの列に含めます。 awk
コマンドは、各行の2つの列を比較し、列が同じ場合はTRUE
を出力し、それ以外の場合はFALSE
を出力します。
両方のファイルの行数が同じであると仮定します。
_awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1
_
比較する文字列が数値の場合は数値比較を行い、それ以外の場合は字句を比較します。たとえば、_100
_と_1.0e2
_は同一と見なされます。どんな場合でも字句比較を強制するには、_f2"" == $0
_に変更します。
awk
の実装に応じて、字句比較はmemcmp()
(バイト間比較)を使用するかのように、またはstrcoll()
を使用するかのように行われます( 2つの文字列は、ロケールの照合順序で同じにソートされます)。これは、サンプルのようにすべての10進数字入力ではなく、一部の文字に対して順序が適切に定義されていない一部のロケールで違いを生む可能性があります。
with open('file1') as file1, open('file2') as file2:
for line1, line2 in Zip(file1, file2):
print(line1 == line2)
出力:
True
True
False
False
大文字のTRUE
とFALSE
が必要な場合は、印刷行を次のいずれかに置き換えます。
print(str(line1 == line2).upper())
print('TRUE' if line1 == line2 else 'FALSE')
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
read
への2つの呼び出しは、ファイル記述子3および4からそれぞれ読み取ります。ファイルは、ループへの2つの入力リダイレクトでこれらにリダイレクトされます。
Tried with awk command and it worked fine
awk 'NR==FNR{a[$1];next}{if ($1 in a){print "TRUE"} else{print "False"}}' file1 file2
出力
TRUE
TRUE
False
False