web-dev-qa-db-ja.com

UNIXで2つの異なるファイルを行ごとに比較するにはどうすればよいですか?

ファイル1:

123
234
345
456

ファイル2:

123
234
343
758

予期される出力:File3:

TRUE
TRUE
FALSE
FALSE

そのため、コードは2つのファイルを比較し、一致する場合は「TRUE」を出力し、それ以外の場合は新しいファイルに「FALSE」を出力する必要があります。誰かがこの解決策を提供してくれませんか?

13
Velu

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スタイルのエスケープ構文を使用して、各行の出力後に新しい行を出力します。

56
αғsнιη

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

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

これは、pasteを使用して2つのタブ区切りの列を作成し、2つのファイルの内容をいずれかの列に含めます。 awkコマンドは、各行の2つの列を比較し、列が同じ場合はTRUEを出力し、それ以外の場合はFALSEを出力します。

24
Kusalananda

両方のファイルの行数が同じであると仮定します。

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

比較する文字列が数値の場合は数値比較を行い、それ以外の場合は字句を比較します。たとえば、_100_と_1.0e2_は同一と見なされます。どんな場合でも字句比較を強制するには、_f2"" == $0_に変更します。

awkの実装に応じて、字句比較はmemcmp()(バイト間比較)を使用するかのように、またはstrcoll()を使用するかのように行われます( 2つの文字列は、ロケールの照合順序で同じにソートされます)。これは、サンプルのようにすべての10進数字入力ではなく、一部の文字に対して順序が適切に定義されていない一部のロケールで違いを生む可能性があります。

10

Python 3

with open('file1') as file1, open('file2') as file2:
    for line1, line2 in Zip(file1, file2):
        print(line1 == line2)

出力:

True
True
False
False

大文字のTRUEFALSEが必要な場合は、印刷行を次のいずれかに置き換えます。

print(str(line1 == line2).upper())
print('TRUE' if line1 == line2 else 'FALSE')
7
wjandrea

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つの入力リダイレクトでこれらにリダイレクトされます。

4
glenn jackman
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
0