Shellは2つのリストを比較し、3番目のリストの違いを印刷します。

Shellは2つのリストを比較し、3番目のリストの違いを印刷します。

a.txtとb.txtという2つのテキストファイルがあります。

a.txt

1
2
3
4
5

b.txt

3
5

一致する数字は「0」として印刷され、一致しない数字は「1」で印刷されるc.txtが必要です。

1
1
0
1
0

私はcommが行だけを抑制/印刷できることを知っていますが、上記のc.txtをどのように取得できますか?

とても感謝しています。

答え1

diff参加せずに混合したい場合は、ここに別のオプションがあります。

sdiff -l a.txt b.txt | sed -e 's/.*<.*/1/' -e 's/.*(.*/0/'

sedそこでより良い表現を得るか、次のように変更することもできますが、awkこれはクイックショットなので、次にリダイレクトするだけです。c.txt

答え2

don_crisstiが指摘したように、awk非常に簡単です。

awk 'FNR==NR { match_nmbrs[$1]++; next;}
             {if($1 in match_nmbrs)
                  print 0;
              else
                  print 1; }
    ' b.txt a.txt

最初の{...}条件は最初のファイルのレコードにのみ適用され、2番目の条件{...}は2番目のファイルのレコードにのみ適用されます。私の考えでは、他のすべては説明が必要です。

答え3

awk出力に使用comm

$ comm a.txt b.txt | awk -F'\t' '$1 || $2 { print 1 } $3 { print 0 }'

commタブで区切られた3つの列を出力します。

  1. 最初のファイルの行のみ、
  2. 2番目のファイルの行のみ
  3. その行は両方のファイルに存在します。

スクリプトawkは、最初の2つの列に項目を含むすべての入力を「一致しない」として分類して出力し、3番目の列に項目が含まれている場合は一致を出力します10

comm両方のファイルを並べ替える必要があります。

答え4

ここに別のawk解決策があります

awk '1,$0=system("grep -qx "$1" b.txt")' a.txt

関連情報